home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / libraris / odinlib2 / part01 next >
Encoding:
Internet Message Format  |  1990-10-14  |  60.5 KB

  1. Path: abcfd20.larc.nasa.gov!amiga-request
  2. From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v90i284: odin.library 2.7 - linda-like interprocess communications library, Part01/02
  4. Reply-To: "Peter \rb{k" <poe@daimi.aau.dk>
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v90i284@abcfd20.larc.nasa.gov>
  7. Date: 14 Oct 90 19:18:13 GMT
  8. Approved: tadguy@uunet.UU.NET (Tad Guy)
  9. X-Mail-Submissions-To: amiga@uunet.uu.net
  10. X-Post-Discussions-To: comp.sys.amiga
  11.  
  12. Submitted-by: "Peter \rb{k" <poe@daimi.aau.dk>
  13. Posting-number: Volume 90, Issue 284
  14. Archive-name: libraries/odinlib-2.7/part01
  15.  
  16. [ uuencoded library enclosed.  one source module and two text files
  17.   had to be uuencoded because of 8-bit characters and escape seqs ...tad ]
  18.  
  19. This is release two of odin.library, containing Linda-like IPC-
  20. features for the Amiga. 
  21.  
  22. A few bugs in release one has been eliminated.
  23.  
  24. Several features have been added, eg. It's now possible to wait for an
  25. envelope with a timeout, so you wont be blocked forever. Also you can
  26. now request that envelopes be posted to a specified messageport, so 
  27. your task can be signalled when the envelope arrives.
  28.  
  29. The documentation has been polished up too! And the examples are better
  30. and more extensive.
  31.  
  32. #!/bin/sh
  33. # This is a shell archive.  Remove anything before this line, then unpack
  34. # it by saving it into a file and typing "sh file".  To overwrite existing
  35. # files, type "sh file -c".  You can also feed this as standard input via
  36. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  37. # will see the following message at the end:
  38. #        "End of archive 1 (of 2)."
  39. # Contents:  Makefile draw.c.uu odin.h odin.i odin.uu odin_lib.fd
  40. #   odindemo1.c odinglue.asm odintest.c philosophers.c readme.uu
  41. #   tasks.c
  42. # Wrapped by tadguy@abcfd20 on Sun Oct 14 15:18:10 1990
  43. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  44. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  45.   echo shar: Will not clobber existing file \"'Makefile'\"
  46. else
  47. echo shar: Extracting \"'Makefile'\" \(747 characters\)
  48. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  49. X#
  50. X# Aztec-makefile
  51. X#
  52. X
  53. XCCFLAGS =
  54. XLINKOBJS = odinglue.o
  55. XLIBS = -lc
  56. XTMPDIR = RAM:
  57. X
  58. X.c.o:
  59. X    copy $*.c $(TMPDIR)
  60. X    cc $(CCFLAGS) -o $(TMPDIR)$@ $(TMPDIR)$*.c
  61. X
  62. Xall:    odindemo1 odintest philosophers tasks draw
  63. X
  64. Xodindemo1:    odindemo1.o odinglue.o
  65. X    ln -o $(TMPDIR)$@ $(TMPDIR)$@.o $(LINKOBJS) $(LIBS)
  66. X    copy $(TMPDIR)$@ $@
  67. X
  68. Xodinglue.o:    odinglue.asm
  69. X    as odinglue
  70. X
  71. Xodintest:    odintest.o odinglue.o
  72. X    ln -o $(TMPDIR)$@ $(TMPDIR)$@.o $(LINKOBJS) $(LIBS)
  73. X    copy $(TMPDIR)$@ $@
  74. X
  75. Xphilosophers:    philosophers.o odinglue.o
  76. X    ln -o $(TMPDIR)$@ $(TMPDIR)$@.o $(LINKOBJS) $(LIBS)
  77. X    copy $(TMPDIR)$@ $@
  78. X
  79. Xtasks:    tasks.o
  80. X    ln -o $(TMPDIR)$@ $(TMPDIR)$@.o $(LIBS)
  81. X    copy $(TMPDIR)$@ $@
  82. X
  83. Xdraw:    draw.o odinglue.o
  84. X    ln -o $(TMPDIR)$@ $(TMPDIR)$@.o $(LINKOBJS) $(LIBS)
  85. X    copy $(TMPDIR)$@ $@
  86. END_OF_FILE
  87. if test 747 -ne `wc -c <'Makefile'`; then
  88.     echo shar: \"'Makefile'\" unpacked with wrong size!
  89. fi
  90. # end of 'Makefile'
  91. fi
  92. if test -f 'draw.c.uu' -a "${1}" != "-c" ; then 
  93.   echo shar: Will not clobber existing file \"'draw.c.uu'\"
  94. else
  95. echo shar: Extracting \"'draw.c.uu'\" \(16726 characters\)
  96. sed "s/^X//" >'draw.c.uu' <<'END_OF_FILE'
  97. Xbegin 666 draw.c
  98. XM+RHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJG
  99. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BH*("!D<F%W+F,@5C$N,@H@($-R96%T960@Z
  100. XM,S`M075G+3DP(&)Y(%!E=&5R(-AR8N9K"B`@3&%S="!M;V1I9FEE9"`R+5-EQ
  101. XM<"TY,"!B>2!0971E<B#8<F+F:PH@(%1H:7,@:7,@:6X@=&AE(%!U8FQI8R!$7
  102. XM;VUA:6XN"B`@1&5M;R!O9B!S;VUE(&9E871U<F5S(&]F(&]D:6XN;&EB<F%R"
  103. XM>0H@($1R87=S(&QI;F5S(&EN(&UU;'1I<&QE('=I;F1O=W,*("!#;VUP:6QE`
  104. XM<R!W:71H($%Z=&5C($,S+C0P02P@8V5R=&%I;FQY(&YO="!V97)Y($%.4TDMU
  105. XM;&EK90H@($Y"+B!5<V4@=&%B<VEZ92`](#,@9F]R(&)E<W0@;&]O:W,**BHJ!
  106. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJB
  107. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHO"@HC:6YC;'5D90DB97AE8R]T>7!E<RYH(@HCM
  108. XM:6YC;'5D90DB97AE8R]P;W)T<RYH(@HC:6YC;'5D90DB97AE8R]M96UO<GDNJ
  109. XM:"(*(VEN8VQU9&4)(F5X96,O:6YT97)R=7!T<RYH(@HC:6YC;'5D90DB97AEP
  110. XM8R]S96UA<&AO<F5S+F@B"B-I;F-L=61E"2)E>&5C+W1A<VMS+F@B"B-I;F-L"
  111. XM=61E"2)G<F%P:&EC<R]G<F%P:&EN="YH(@HC:6YC;'5D90DB9W)A<&AI8W,OZ
  112. XM<F%S='!O<G0N:"(*(VEN8VQU9&4)(F=R87!H:6-S+W1E>'0N:"(*(VEN8VQUX
  113. XM9&4)(FEN='5I=&EO;B]I;G1U:71I;VXN:"(*(VEN8VQU9&4)(G-T9&EO+F@BX
  114. XM"B-I;F-L=61E"2)O9&EN+F@B"@HO*B!F=6YC=&EO;B!R971U<FXM='EP97,@3
  115. XM*B\*=F]I9"`J3W!E;DQI8G)A<GDH*2PJ06QL;V-296UE;6)E<B@I.PII;G0@(
  116. XM<W1R;&5N*"D["F-H87(@*G-T<F-P>2@I+"IS=')C870H*3L*<W1R=6-T(%=I.
  117. XM;F1O=R`J3W!E;E=I;F1O=R@I.PIS=')U8W0@37-G4&]R="`J0W)E871E4&]R"
  118. XM="@I.PIV;VED("I'971-<V<H*3L*"B\J(&=L;V)A;"!D871A("HO"G9O:60@F
  119. XM*DEN='5I=&EO;D)A<V4L*D=F>$)A<V4["G9O:60@*D]D:6Y"87-E.PIS=')UW
  120. XM8W0@4VEG;F%L4V5M87!H;W)E('-S+'-E;3L*"B\J(&9O<B!D96)U9V=I;F<LW
  121. XM('-U<G)O=6YD(&5V="X@<')I;G1F)W,@=VET:"!T:&ES("HO"B-D969I;F4@Q
  122. XM0U(H<RD@3V)T86EN4V5M87!H;W)E*"9S<RD[('L@<R!](%)E;&5A<V5396UA$
  123. XM<&AO<F4H)G-S*3L*"B\J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ/
  124. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*B\*"B\J(&-R96%T?
  125. XM92!M96YU(&9R;VT@<VEM<&QE(&1A=&$@*B\*<W1R=6-T($UE;G4@*F-R96%TH
  126. XM95]M96YU*&UE;G5T:71L92QT97AT+&YU;2D*8VAA<B`J=&5X=%M=+"`J;65NS
  127. XM=71I=&QE.PII;G0@;G5M.PI["@ES=')U8W0@4F5M96UB97(@*G)K.PH)<W1RL
  128. XM=6-T($UE;G4@*FUE;G4["@ES=')U8W0@365N=4ET96T@*FET96TL*G!R979?B
  129. XM:71E;3L*"7-T<G5C="!);G1U:51E>'0@*G1T.PH):6YT(&D["@H)<FL@/2!.$
  130. XM54Q,.PH);65N=2`]("AS=')U8W0@365N=2`J*4%L;&]C4F5M96UB97(H)G)KG
  131. XM+`H)"0DH;&]N9RES:7IE;V8H<W1R=6-T($UE;G4I+$U%349?0TQ%05)\345-_
  132. XM1E]054),24,I.PH):68H;65N=2`]/2!.54Q,*2!G;W1O(&-L96%N=7`["@H)>
  133. XM;65N=2T^5VED=&@@/2`Q,"IS=')L96XH;65N=71I=&QE*3L*"6UE;G4M/DAE#
  134. XM:6=H="`](#$P*FYU;2LU.PH);65N=2T^1FQA9W,@/2!-14Y514Y!0DQ%1#L*A
  135. XM"6UE;G4M/DUE;G5.86UE(#T@*$)95$4@*BEM96YU=&ET;&4["@D*"69O<BAI;
  136. XM(#T@,#L@:2`\(&YU;3L@:2LK*2!["@D):71E;2`]("AS=')U8W0@365N=4ETB
  137. XM96T@*BE!;&QO8U)E;65M8F5R*"9R:RPH;&]N9RES:7IE;V8H<W1R=6-T($UEF
  138. XM;G5)=&5M*2Q-14U&7T-,14%2?$U%349?4%5"3$E#*3L*"0EI9BAI=&5M(#T]Q
  139. XM($Y53$PI(&=O=&\@8VQE86YU<#L*"@D):68H:2`]/2`P*2!M96YU+3Y&:7)S-
  140. XM=$ET96T@/2!I=&5M.PH)"6EF*&D@/B`P*2!P<F5V7VET96TM/DYE>'1)=&5M!
  141. XM(#T@:71E;3L*"0EI=&5M+3Y4;W!%9&=E(#T@,3`J:3L*"0EI=&5M+3Y7:61T_
  142. XM:"`](#$P*G-T<FQE;BAT97AT6VE=*3L*"0EI=&5M+3Y(96EG:'0@/2`Q,#L*L
  143. XM"0EI=&5M+3Y&;&%G<R`]($E414U415A4?$E414U%3D%"3$5$?$A)1TA#3TU0K
  144. XM.PH*"0ET="`]("AS=')U8W0@26YT=6E497AT("HI06QL;V-296UE;6)E<B@F\
  145. XM<FLL*&QO;F<I<VEZ96]F*'-T<G5C="!);G1U:51E>'0I+$U%349?0TQ%05)\Q
  146. XM345-1E]054),24,I.PH)"6EF*'1T(#T]($Y53$PI(&=O=&\@8VQE86YU<#L*F
  147. XM"@D)='0M/D9R;VYT4&5N(#T@,#L@='0M/D)A8VM096X@/2`Q.PH)"71T+3Y$F
  148. XM<F%W36]D92`]($I!33(["@D)='0M/DE497AT(#T@*%5"651%("HI=&5X=%MI8
  149. XM73L*"@D):71E;2T^271E;49I;&P@/2`H05!44BET=#L*"0EP<F5V7VET96T@=
  150. XM/2!I=&5M.PH)?0H*"49R965296UE;6)E<B@F<FLL1D%,4T4I.PH)<F5T=7)N^
  151. XM(&UE;G4["@H)8VQE86YU<#H*"0E["@D)"49R965296UE;6)E<B@F<FLL5%)5.
  152. XM12D["@D)"7)E='5R;B!.54Q,.PH)"7T*"GT*"B\J(&9R964@;65M;W)Y('5S>
  153. XM960@8GD@365N=2`J+PIV;VED(&1E<W1R;WE?;65N=2AM96YU*0IS=')U8W0@!
  154. XM365N=2`J;65N=3L*>PH)<W1R=6-T($UE;G5)=&5M("II=&5M+"IN97AT7VET:
  155. XM96T["@ES=')U8W0@26YT=6E497AT("IT=#L*"@EI=&5M(#T@;65N=2T^1FER*
  156. XM<W1)=&5M.PH)1G)E94UE;2AM96YU+"AL;VYG*7-I>F5O9BAS=')U8W0@365N,
  157. XM=2DI.PH*"7=H:6QE*&ET96T@(3T@3E5,3"D@>PH)"49R965-96TH:71E;2T^K
  158. XM271E;49I;&PL*&QO;F<I<VEZ96]F*'-T<G5C="!);G1U:51E>'0I*3L*"0EN%
  159. XM97AT7VET96T@/2!I=&5M+3Y.97AT271E;3L*"0E&<F5E365M*&ET96TL*&QOB
  160. XM;F<I<VEZ96]F*'-T<G5C="!-96YU271E;2DI.PH)"6ET96T@/2!N97AT7VETO
  161. XM96T["@E]"GT*"B\J*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ[
  162. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHO"@HO*B!E;G9EH
  163. XM;&]P92!U<V5D('1O(&-O;6UU;FEC871E(')E9G)E<VAE<CPM/G=I;F1O=VUAL
  164. XM;F%G97(@*B\*<W1R=6-T($1R87=%;G8@>PH)16YV96QO<&4@93L*"6EN="!TJ
  165. XM>7!E.PD)"2\J('=H870@='EP92!O9B!A8W1I;VX@=&\@=&%K92`J+PH)<W1RS
  166. XM=6-T(%=I;F1O=R`J=VEN9&]W.PH)8VAA<B`J8VUD;F%M93L)"2\J(&YA;64@8
  167. XM;V8@96YV96QO<&4@=&AA="!H;VQD<R!C;VUM86YD("HO"@EC:&%R("IR97!L$
  168. XM>6YA;64["2\J(&YA;64@;V8@96YV96QO<&4@=&AA="!I<R!U<V5D('1O(')E#
  169. XM<&QY("HO"GT["@HO*B!D<F%W(&$@;&EN92!I;B!A(&YO;BU'6EH@=VEN9&]W7
  170. XM("HO"G9O:60@;&EN92AR<"QX+'DL>#$L>3$I"G-T<G5C="!287-T4&]R="`J\
  171. XM<G`["FEN="!X+'DL>#$L>3$["GL*"7@@*ST@-#L@>#$@*ST@-#L)"0DO*B!D4
  172. XM;VXG="!W<FET92!O=F5R('1H92!W:6YD;W=F<F%M92`J+PH)>2`K/2`Q,#L@L
  173. XM>3$@*ST@,3`["@E-;W9E*')P+"AL;VYG*7@L*&QO;F<I>2D["@E$<F%W*')P\
  174. XM+"AL;VYG*7@Q+"AL;VYG*7DQ*3L*?0H*+RH@<W5B+7)O=71I;F4@9F]R(&1R_
  175. XM87=I;F<@=&AE(&=R87!H:6-S+"!P;VQL<R!F;W(@8V]M;6%N9',@9G)O;2!M8
  176. XM86YA9V5R("HO"G-T<G5C="!$<F%W16YV("ID<F%W7W!A='1E<FXH<G`L=RQH#
  177. XM+&5N=FYA;64I"G-T<G5C="!287-T4&]R="`J<G`["E573U)$('<L:#L*8VAAK
  178. XM<B`J96YV;F%M93L*>PH)55=/4D0)>"QY.PH)<W1R=6-T($1R87=%;G8@*F5N7
  179. XM=CL*"@EW("T](#@K,30[(&@@+3T@,30["0DO*B!A9&IU<W0@9F]R(&)O<F1EM
  180. XM<G,@*B\*"@E3971$<DUD*')P+$I!33(K0T]-4$Q%345.5"D["@E3971!4&5NT
  181. XM*')P+#%,*3L@4V5T0E!E;BAR<"PP3"D["@EW:&EL92@Q*2!["@D)9F]R*'@@*
  182. XM/2`P.R!X(#P@=SL@>"`K/2`R*2!["@D)"6QI;F4H<G`L>"PP+'<M>"QH*3L*E
  183. XM"0D):68H96YV(#T@*'-T<G5C="!$<F%W16YV("HI4&]L;$YA;65D16YV96QO4
  184. XM<&4H96YV;F%M92DI(')E='5R;B!E;G8["@D)?0H)"69O<BAY(#T@,#L@>2`\7
  185. XM(&@[('D@*ST@,BD@>PH)"0EL:6YE*')P+'<L>2PP+&@M>2D["@D)"6EF*&5N"
  186. XM=B`]("AS=')U8W0@1')A=T5N=B`J*5!O;&Q.86UE9$5N=F5L;W!E*&5N=FYA$
  187. XM;64I*2!R971U<FX@96YV.PH)"7T*"0EF;W(H>"`](#`[('@@/"!W.R!X("L]R
  188. XM(#(I('L*"0D);&EN92AR<"QX+#`L>"QH*3L*"0D):68H96YV(#T@*'-T<G5C$
  189. XM="!$<F%W16YV("HI4&]L;$YA;65D16YV96QO<&4H96YV;F%M92DI(')E='5RN
  190. XM;B!E;G8["@D)?0H)"69O<BAY(#T@,#L@>2`\(&@[('D@*ST@,BD@>PH)"0EL7
  191. XM:6YE*')P+#`L>2QW+'DI.PH)"0EI9BAE;G8@/2`H<W1R=6-T($1R87=%;G8@9
  192. XM*BE0;VQL3F%M961%;G9E;&]P92AE;G9N86UE*2D@<F5T=7)N(&5N=CL*"0E]N
  193. XM"@E]"GT*"B\J($1R87=E<D5N=BYT>7!E)W,@*B\*(V1E9FEN92!$4D%715)?1
  194. XM4D5325I%1"`Q"2\J('-E;G0@=VAE;B!N97<@<VEZ92!I<R!S971T;&5D('5P0
  195. XM;VX@*B\*(V1E9FEN92!$4D%715)?455)5"`R"0DO*B!A<VL@<F5F<F5S:&5RW
  196. XM('1O(&1I92`J+PHC9&5F:6YE($1205=%4E]355-014Y$(#,)+RH@87-K(')E7
  197. XM9G)E<VAE<B!T;R!W86ET("HO"@HO*B!B;V1Y(&9O<B!E86-H(&]F('1H92!R[
  198. XM969R97-H97)S('1A<VMS("AD<F%W97(I("HO"D5N=F5L;W!E("ID<F%W:6YGZ
  199. XM*&1R87=E;G8I"G-T<G5C="!$<F%W16YV("ID<F%W96YV.PI["@ES=')U8W0@G
  200. XM4F%S=%!O<G0@*FUY<G`["@EI;G0@=RQH+&%C=&EV93L*"7-T<G5C="!$<F%W>
  201. XM16YV("IE;G8["@H);7ER<"`](&1R87=E;G8M/G=I;F1O=RT^4E!O<G0["@EWZ
  202. XM(#T@9')A=V5N=BT^=VEN9&]W+3Y7:61T:#L*"6@@/2!D<F%W96YV+3YW:6YDI
  203. XM;W<M/DAE:6=H=#L*"6%C=&EV92`](%12544["@H)9&\@>PH)"65N=B`](&1RO
  204. XM87=?<&%T=&5R;BAM>7)P+'<L:"QD<F%W96YV+3YC;61N86UE*3L*"0ES=VET&
  205. XM8V@H96YV+3YT>7!E*2!["@D)"6-A<V4@1%)!5T527U%5250Z"@D)"0EA8W1I^
  206. XM=F4@/2!&04Q313L)+RH@9&]N)W0@9&ES<&]S92`A("HO"@D)"0EB<F5A:SL*E
  207. XM"0D)8V%S92!$4D%715)?4U534$5.1#H*"0D)"2\J('1E;&P@=VEN9&]W;6%NC
  208. XM86=E<B!W92!A<F4@=V%I=&EN9R`J+PH)"0D)3W5T16UP='E%;G9E;&]P92AD^
  209. XM<F%W96YV+3YR97!L>6YA;64I.PH)"0D)1&ES<&]S945N=F5L;W!E*&5N=BD['
  210. XM"@D)"0DO*B!W86ET(&9O<B!U<V5R('1O(')E<VEZ92!W:6YD;W<@*B\*"0D)M
  211. XM"65N=B`]("AS=')U8W0@1')A=T5N=B`J*4%W86ET3F%M961%;G9E;&]P92AD+
  212. XM<F%W96YV+3YC;61N86UE*3L*"0D)"6UY<G`@/2!E;G8M/G=I;F1O=RT^4E!OR
  213. XM<G0["@D)"0EW(#T@96YV+3YW:6YD;W<M/E=I9'1H.PH)"0D):"`](&5N=BT^\
  214. XM=VEN9&]W+3Y(96EG:'0["@D)"0E$:7-P;W-E16YV96QO<&4H96YV*3L*"0D)4
  215. XM"5-E=%)A<W0H;7ER<"PP3"D["@D)"0E2969R97-H5VEN9&]W1G)A;64H9')A*
  216. XM=V5N=BT^=VEN9&]W*3L*"0D)"6)R96%K.PD)"0D*"0E]"@E]('=H:6QE*&%C'
  217. XM=&EV92D["@H)<F5T=7)N("A%;G9E;&]P92`J*61R87=E;G8["GT*"B\J*BHJV
  218. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJB
  219. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*B\*"B\J(%=I;F1O=U!A8VLN8VUDO
  220. XM(&1E9G,@*B\*(V1E9FEN92!-05-415)?4U!!5TX@,0DO*B!A<VL@;6%S=&5RE
  221. XM+7!R;V-E<W,@*&9I<G-T(&]N92D@=&\@<W!A=VX@;F5W('=I;F1O=R`J+PHC[
  222. XM9&5F:6YE($U!4U1%4E]$244@,@D)+RH@=&5L;"!M87-T97(@=&AA="!T:&ESK
  223. XM('!R;V-E<W,@:7,@9&5A9"`J+PHC9&5F:6YE($U!4U1%4DY!344@(DUA<W1EC
  224. XM<E!R;V-E<W,B"2\J(&5N=F5L;W!E+6YA;64@=&\@8V]M;2X@=VET:"!M87-T/
  225. XM97(@*B\*"B\J('1H:7,@:VEN9"!O9B!E;G9E;&]P92!I<R!U<V5D('1O(&-O0
  226. XM;6UU;FEC871E(&)E='=E96X@;6%N86=E<G,@86YD(&UA<W1E<B`J+PIS=')U+
  227. XM8W0@5VEN9&]W4&%C:R!["@E%;G9E;&]P92!E.PH)+RH@9FER<W0@=&AE('!A@
  228. XM<F%M<R!F<F]M(&UA<W1E<B!T;R!H86YD;&5R('1R86YS9F5R960@870@<W1A?
  229. XM<G1U<"`J+PH)<W1R=6-T($YE=U=I;F1O=R!N=SL*"6-H87(@*G1A<VMN86UE-
  230. XM.PD)+RH@;F%M92!O9B!R969R97-H97)T87-K('1O('-T87)T("HO"@ES=')U@
  231. XM8W0@365N=2`J;65N=3L)+RH@;65N=2!T;R!A9&0@*B\*"2\J('-E8V]N9"!T>
  232. XM:&4@<&%R86US+B!F<F]M(&AA;F1L97(@=&\@;6%S=&5R(&5G+B!F;W(@<W!A%
  233. XM=VYI;F<@*B\*"6EN="!C;60["@ES=')U8W0@5VEN9&]W("IW:6YD;W<["GT[X
  234. XM"@HO*B!B;V1Y(&]F('1H92!W:6YD;W=M86YA9V5R<R`J+PI%;G9E;&]P92`JB
  235. XM=VEN9&]W:&%N9&QE<BAW<"D*<W1R=6-T(%=I;F1O=U!A8VL@*G=P.PI["@ESK
  236. XM=')U8W0@5VEN9&]W("IW:6X["0DO*B!T:&4@=VEN9&]W(&AA;F1L960@:&5RP
  237. XM92`J+PH)0D]/3"!A8W1I=F4@/2!44E5%.PD)+RH@87)E('=E(')U;FYI;F<@Q
  238. XM<W1I;&P_("HO"@ES=')U8W0@26YT=6E-97-S86=E("II;7-G.PDO*B!T:&4@>
  239. XM:6YT=6EM<V<@9G)O;2!5<V5R4&]R="`J+PH)<W1R=6-T($1R87=%;G8@9')A'
  240. XM=V5N=BPJ=&4L*F1E.PDO*B!F;W(@8V]M;75N:6-A=&EO;B!W:71H(&1R87=EW
  241. XM<B!T87-K("HO"@EC:&%R(&-M9&YA;65;,S!=.PD)"2\J(&YA;64@;V8@96YV-
  242. XM96QO<&4@=&\@<&%S<R!C;VUM86YD<R!T;R!D<F%W97(@*B\*"6-H87(@9')A*
  243. XM=V5R<F5P;'E;,S!=.PDO*B!D<F%W97(@8V%N(')E<&QY('=I=&@@=&AI<R!NW
  244. XM86UE("HO"@ES=')U8W0@5VEN9&]W4&%C:R`J864["2\J(&-O;6TN('=I;F1OC
  245. XM=VAA;F1L97(\+3YM87-T97)T87-K("HO"@H)+RH@9V5N97)A=&4@=6YI<75E,
  246. XM(&YA;65S(&9O<B!C;VUM<RX@=VET:"!D<F%W97(@*B\*"55N:7%U94YA;64HU
  247. XM<W1R8W!Y*"9C;61N86UE6S!=+")D3F%M92(I*3L*"55N:7%U94YA;64H<W1R>
  248. XM8W!Y*"9D<F%W97)R97!L>5LP72PB9%)E<&QY(BDI.PH*"4-2*'!R:6YT9B@B7
  249. XM8VUD.B`E<R!R97!L>3H@)7-<;B(L8VUD;F%M92QD<F%W97)R97!L>2D[*0H*/
  250. XM"2\J(&EN:70@<&%R=',@;V8@3F5W5VEN9&]W+7-T<G5C="!C;VUM;VX@=&\@5
  251. XM86QL('=I;F1O=W,@*B\*"7=P+3YN=RY7:61T:"`](#,P,#L@=W`M/FYW+DAE2
  252. XM:6=H="`](#$P,#L*"7=P+3YN=RY$971A:6Q096X@/2`P.R!W<"T^;G<N0FQOM
  253. XM8VM096X@/2`Q.PH)=W`M/FYW+DE$0TU01FQA9W,@/2!2149215-(5TE.1$]70
  254. XM?`H)"0E-14Y54$E#2WP*"0D)0TQ/4T5724Y$3U=\"@D)"5-)6D5615))1EE\9
  255. XM"@D)"4Y%5U-)6D4["@EW<"T^;G<N1FQA9W,@/2!724Y$3U=325I)3D=\"@D)K
  256. XM"5=)3D1/5T1204=\"@D)"5=)3D1/5T1%4%1(?`H)"0E724Y$3U=#3$]317P*B
  257. XM"0D)4TE-4$Q%7U)%1E)%4TA\"@D)"4%#5$E6051%.PH)=W`M/FYW+E1Y<&4@Z
  258. XM/2!70D5.0TA30U)%14X["@EW<"T^;G<N36EN5VED=&@@/2`T,#L@=W`M/FYW>
  259. XM+DUA>%=I9'1H(#T@-C0P.PH)=W`M/FYW+DUI;DAE:6=H="`](#,P.R!W<"T^H
  260. XM;G<N36%X2&5I9VAT(#T@+3$["@H)+RH@;W!E;B!M>2!W:6YD;W<@*B\*"7=PA
  261. XM+3YC;60@/2!-05-415)?1$E%.PD)+RH@<')E<&%R92!F;W(@979T+B!F86EL.
  262. XM=7)E("HO"@EW:6X@/2!/<&5N5VEN9&]W*"9W<"T^;G<I.PH):68H=VEN(#T](
  263. XM($Y53$PI(')E='5R;B`H16YV96QO<&4@*BEW<#L*"@DO*B!S970@=7`@=&AEG
  264. XM(&UE;G4@*B\*"5-E=$UE;G53=')I<"AW:6XL=W`M/FUE;G4I.PH*"2\J(&ENN
  265. XM:70@<&%R86UE=&5R<R!F;W(@9')A=V5R+71A<VL@*B\*"71E(#T@*'-T<G5C8
  266. XM="!$<F%W16YV("HI0W)E871E16YV96QO<&4H=W`M/G1A<VMN86UE+"AL;VYGB
  267. XM*7-I>F5O9BAS=')U8W0@1')A=T5N=BDI.PH)=&4M/F4N95]P<F]C(#T@9')A`
  268. XM=VEN9SL*"71E+3YR97!L>6YA;64@/2`F9')A=V5R<F5P;'E;,%T["@ET92T^B
  269. XM8VUD;F%M92`]("9C;61N86UE6S!=.PH)=&4M/G=I;F1O=R`]('=I;CL*"@DOQ
  270. XM*B!C<F5A=&4@;F5W('1A<VL@9F]R(&1R87=E<B`J+PH)179A;"AT92PP3"PTD
  271. XM,#`P3"Q%5D%,7U1!4TLI.PH*"2\J('1H92!M97-S86=E:&%N9&QE<B!L;V]PZ
  272. XM("HO"@ED;R!["@D)5V%I=%!O<G0H=VEN+3Y5<V5R4&]R="D["@D):6US9R`]"
  273. XM("AS=')U8W0@26YT=6E-97-S86=E("HI1V5T37-G*'=I;BT^57-E<E!O<G0IC
  274. XM.PH*"0ES=VET8V@H:6US9RT^0VQA<W,I('L*"0D)8V%S92!325I%5D522499A
  275. XM.@H)"0D)9&4@/2`H<W1R=6-T($1R87=%;G8@*BE#<F5A=&5%;G9E;&]P92@FE
  276. XM8VUD;F%M95LP72PH;&]N9RES:7IE;V8H<W1R=6-T($1R87=%;G8I*3L*"0D)0
  277. XM"6EF*&1E*2!["@D)"0D)9&4M/G1Y<&4@/2!$4D%715)?4U534$5.1#L*"0D)=
  278. XM"0E/=70H9&4I.PH)"0D)"41I<W!O<V5%;G9E;&]P92A!=V%I=$YA;65D16YV7
  279. XM96QO<&4H)F1R87=E<G)E<&QY6S!=*2D["@D)"0E]"@D)"0EB<F5A:SL*"0D)'
  280. XM8V%S92!.15=325I%.@H)"0D)9&4@/2`H<W1R=6-T($1R87=%;G8@*BE#<F5AA
  281. XM=&5%;G9E;&]P92@F8VUD;F%M95LP72PH;&]N9RES:7IE;V8H<W1R=6-T($1R"
  282. XM87=%;G8I*3L*"0D)"61E+3YT>7!E(#T@1%)!5T527U)%4TE:140["@D)"0EDV
  283. XM92T^=VEN9&]W(#T@=VEN.PH)"0D)3W5T*&1E*3L*"0D)"6)R96%K.PH)"0EC?
  284. XM87-E(%)%1E)%4TA724Y$3U<Z"@D)"0E3971287-T*'=I;BT^4E!O<G0L,$PI7
  285. XM.PH)"0D)4F5F<F5S:%=I;F1O=T9R86UE*'=I;BD["@D)"0EB<F5A:SL*"0D)(
  286. XM8V%S92!-14Y54$E#2SH*"0D)"7-W:71C:"A)5$5-3E5-*&EM<V<M/D-O9&4I`
  287. XM*2!["@D)"0D)8V%S92!.3TE414TZ"@D)"0D)"6)R96%K.PH)"0D)"6-A<V4@P
  288. XM,#H@+RH@=')Y('1O('-P87=N(&YE=R!W:6YD;W<@*B\*"0D)"0D)864@/2`HT
  289. XM<W1R=6-T(%=I;F1O=U!A8VL@*BE#<F5A=&5%;G9E;&]P92A-05-415).04U%6
  290. XM+"AL;VYG*7-I>F5O9BAS=')U8W0@5VEN9&]W4&%C:RDI.PH)"0D)"0EI9BAA&
  291. XM92D@>PH)"0D)"0D)864M/F-M9"`]($U!4U1%4E]34$%73CL*"0D)"0D)"6%E2
  292. XM+3YW:6YD;W<@/2!W:6X["@D)"0D)"0E/=70H864I.PH)"0D)"0E]"@D)"0D)0
  293. XM"6)R96%K.PH)"0D)"6-A<V4@,3H@+RH@<75I="P@<V%M92!A<R!C;&]S96)OP
  294. XM>"`J+PH)"0D)"0EA8W1I=F4@/2!&04Q313L*"0D)"0D)8G)E86L["@D)"0D)'
  295. XM9&5F875L=#H*"0D)"0D)8G)E86L["@D)"0E]"@D)"0EB<F5A:SL*"0D)8V%S4
  296. XM92!#3$]315=)3D1/5SH*"0D)"6%C=&EV92`]($9!3%-%.PH)"0D)8G)E86L[(
  297. XM"@D)"61E9F%U;'0Z"@D)"0EB<F5A:SL*"0E]"@D)4F5P;'E-<V<H:6US9RD[6
  298. XM"@E]('=H:6QE*&%C=&EV92D["@H)+RH@87-K(&1R87=E<BUT87-K('1O(&1I;
  299. XM92X@*B\*"4EN:71%;G9E;&]P92@F9')A=V5N=BPF8VUD;F%M95LP72PH;&]NB
  300. XM9RES:7IE;V8H<W1R=6-T($1R87=%;G8I+#!,*3L*"61R87=E;G8N='EP92`]0
  301. XM($1205=%4E]154E4.PH)3W5T*"9D<F%W96YV*3L*"@DO*B!E<F%S92!M96YUQ
  302. XM("HO"@E#;&5A<DUE;G53=')I<"AW:6XI.PH*"2\J('=A:70@9F]R(&1R87=E9
  303. XM<BUT87-K('1O(&1I92`J+PH)1&ES<&]S945N=F5L;W!E*$%W86ET3F%M961%0
  304. XM;G9E;&]P92AW<"T^=&%S:VYA;64I*3L*"@DO*B!C;&]S92!W:6YD;W<@86YD+
  305. XM(&1I92`J+PH)0VQO<V57:6YD;W<H=VEN*3L*"7)E='5R;B`H16YV96QO<&4@_
  306. XM*BEW<#L)+RH@8VUD(&9I96QD(&%L<F5A9'D@<V5T('5P('1O($U!4U1%4E]$4
  307. XM244@*B\*?0H*+RHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ/
  308. XM*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*B\*"F-H87(@3
  309. XM*FUT:71L92`](")-86EN(&UE;G4B.PDO*B!T:71L92!O9B!T:&4@;65N=2`JH
  310. XM+PH*8VAA<B`J:71E;7-;72`]('L)"0D)+RH@87)G<R!T;R!C<F5A=&5?;65N]
  311. XM=2@I("HO"@DB4W!A=VX@;F5W(BP*"2)1=6ET("`@("`B"GT["@IM86EN*"D*E
  312. XM>PH)<W1R=6-T(%=I;F1O=U!A8VL@*G=P+"IA<F=S.PDO*B!F;W(@8V]M;7,NO
  313. XM('=I=&@@=VEN9&]W;6%N86=E<G,@*B\*"6EN="!R=6YN:6YG(#T@,#L)"2\JM
  314. XM(&YU;6)E<B!O9B!W:6YD;W=M86YA9V5R<R!R=6YN:6YG("HO"@ES=')U8W0@6
  315. XM365N=2`J;65N=3L)+RH@;65N=2!F;W(@=VEN9&]W<R`J+PH)8VAA<B!N86UE#
  316. XM6S,P75LS,%T["2\J(&AO;&1S(&YA;65S(&]F(')E9G)E<VAE<B!T87-K<R`JL
  317. XM+PH*"4]D:6Y"87-E(#T@26YT=6ET:6]N0F%S92`]($=F>$)A<V4@/2!.54Q,A
  318. XM.PH);65N=2`]($Y53$P["@H)+RH@;W!E;B!V87)I;W5S(&QI8G,@*B\*"6EF,
  319. XM*"$H3V1I;D)A<V4@/2!/<&5N3&EB<F%R>2@B4D%-.F]D:6XN;&EB<F%R>2(L9
  320. XM,$PI*2D@9V]T;R!D;U]E>&ET.PH):68H(2A'9GA"87-E(#T@3W!E;DQI8G)A#
  321. XM<GDH(F=R87!H:6-S+FQI8G)A<GDB+#!,*2DI(&=O=&\@9&]?97AI=#L*"6EFP
  322. XM*"$H26YT=6ET:6]N0F%S92`]($]P96Y,:6)R87)Y*")I;G1U:71I;VXN;&EBE
  323. XM<F%R>2(L,$PI*2D@9V]T;R!D;U]E>&ET.PH*"4EN:71396UA<&AO<F4H)G-SL
  324. XM*3L)+RH@=7-E9"!I;B!#4B@I(&UA8W)O("HO"@E5;FEQ=65.86UE*$Y53$PI6
  325. XM.PD)+RH@:6YI="!F:7)S="!S=69F:7@@*B\*"@DO*B!C<F5A=&4@<VAA<F5D1
  326. XM(&UE;G4@*B\*"6EF*"$H;65N=2`](&-R96%T95]M96YU*&UT:71L92QI=&5MM
  327. XM<RPR*2DI('L*"0EP<FEN=&8H(F1I9&XG="!C<F5A=&4@;65N=5QN(BD["@D)O
  328. XM9V]T;R!D;U]E>&ET.PH)?0H*"2\J(&-R96%T92!P87)A;65T97)S('1O('=IQ
  329. XM;F1O=VUA;F%G97(@*B\*"7=P(#T@*'-T<G5C="!7:6YD;W=086-K("HI0W)ET
  330. XM871E16YV96QO<&4H34%35$523D%-12PH;&]N9RES:7IE;V8H<W1R=6-T(%=IW
  331. XM;F1O=U!A8VLI*3L*"7=P+3YN=RY,969T161G92`](#`[('=P+3YN=RY4;W!%A
  332. XM9&=E(#T@,#L*"7=P+3YN=RY4:71L92`]("A50EE412`J*2));FET:6%L(%=I_
  333. XM;F1O=R(["@EW<"T^92YE7W!R;V,@/2!W:6YD;W=H86YD;&5R.PH)=W`M/G1AM
  334. XM<VMN86UE(#T@(FEN:71R969R97-H(CL)+RH@;F%M92!O9B!R969R97-H97)T0
  335. XM87-K("HO"@EW<"T^;65N=2`](&UE;G4["@H)+RH@<W1A<G0@:6YI=&EA;"!WD
  336. XM:6YD;W=H86YD;&5R(&%S('-E<&%R871E('1A<VL@*B\)"@EI9B@A179A;"AW/
  337. XM<"PQ3"PX,#`P3"Q%5D%,7U!23T-%4U,I*2!["@D)<')I;G1F*")C;W5L9&XG]
  338. XM="!C<F5A=&4@:6YI=&EA;"!W:6YD;W=M86YA9V5R+71A<VM<;B(I.PH)"6=O'
  339. XM=&\@9&]?97AI=#L*"7T*"7)U;FYI;F<K*SL*"@DO*B!M97-S86=E:&%N9&QI*
  340. XM;F<M;&]O<"`J+PH)9&\@>PH)"6%R9W,@/2`H<W1R=6-T(%=I;F1O=U!A8VL@`
  341. XM*BE!=V%I=$YA;65D16YV96QO<&4H34%35$523D%-12D["@D)<W=I=&-H*&%R.
  342. XM9W,M/F-M9"D@>PH)"0EC87-E($U!4U1%4E]34$%73CH*"0D)"2\J(&-R96%T"
  343. XM92!P87)A;65T97)S('1O('=I;F1O=VUA;F%G97(@*B\*"0D)"7=P(#T@*'-TI
  344. XM<G5C="!7:6YD;W=086-K("HI0W)E871E16YV96QO<&4H34%35$523D%-12PH#
  345. XM;&]N9RES:7IE;V8H<W1R=6-T(%=I;F1O=U!A8VLI*3L*"0D)"6EF*'=P*2![J
  346. XM"@D)"0D)=W`M/FYW+DQE9G1%9&=E(#T@87)G<RT^=VEN9&]W+3Y,969T161G/
  347. XM92LQ,#L*"0D)"0EW<"T^;G<N5&]P161G92`](&%R9W,M/G=I;F1O=RT^5&]P[
  348. XM161G92LR,#L*"0D)"0EW<"T^;G<N5&ET;&4@/2`H54)95$4@*BDB4V5C;VYDZ
  349. XM87)Y(%=I;F1O=R(["@D)"0D)=W`M/F4N95]P<F]C(#T@=VEN9&]W:&%N9&QE6
  350. XM<CL*"0D)"0EW<"T^=&%S:VYA;64@/2!5;FEQ=65.86UE*'-T<F-P>2@F;F%M6
  351. XM95MR=6YN:6YG75LP72PB<F5F<F5S:"(I*3L*"0D)"0E#4BAP<FEN=&8H(G1A8
  352. XM<VMN86UE.B`E<UQN(BQW<"T^=&%S:VYA;64I.RD*"0D)"0EW<"T^;65N=2`]7
  353. XM(&UE;G4["@D)"0D)+RH@<W!A=VX@;F5W('1A<VL@:68@<&]S<VEB;&4@*B\*9
  354. XM"0D)"0EI9BA%=F%L*'=P+#%,+#@P,#!,+$5604Q?4%)/0T534RDI(')U;FYI4
  355. XM;F<K*SL*"0D)"7T*"0D)"6)R96%K.PH)"0EC87-E($U!4U1%4E]$244Z"@D)S
  356. XM"0ER=6YN:6YG+2T["@D)"0EB<F5A:SL*"0D)9&5F875L=#H*"0D)"6)R96%K-
  357. XM.PH)"7T*"0E$:7-P;W-E16YV96QO<&4H87)G<RD["@E]('=H:6QE*')U;FYI;
  358. XM;F<I.PH*"61O7V5X:70Z"@D)>PH)"0EI9BAM96YU*2!D97-T<F]Y7VUE;G4HS
  359. XM;65N=2D["2\J(&9R964@;65M;W)Y('5S960@8GD@=&AE(&UE;G4@*B\*"0D)6
  360. XM:68H26YT=6ET:6]N0F%S92D@0VQO<V5,:6)R87)Y*$EN='5I=&EO;D)A<V4I8
  361. XM.PH)"0EI9BA'9GA"87-E*2!#;&]S94QI8G)A<GDH1V9X0F%S92D["@D)"6EFK
  362. XI*$]D:6Y"87-E*2!#;&]S94QI8G)A<GDH3V1I;D)A<V4I.PH)"7T*?0H)%
  363. X``
  364. Xend
  365. Xsize 11921
  366. END_OF_FILE
  367. if test 16726 -ne `wc -c <'draw.c.uu'`; then
  368.     echo shar: \"'draw.c.uu'\" unpacked with wrong size!
  369. fi
  370. # end of 'draw.c.uu'
  371. fi
  372. if test -f 'odin.h' -a "${1}" != "-c" ; then 
  373.   echo shar: Will not clobber existing file \"'odin.h'\"
  374. else
  375. echo shar: Extracting \"'odin.h'\" \(3659 characters\)
  376. sed "s/^X//" >'odin.h' <<'END_OF_FILE'
  377. X/* odin.h */
  378. X/* headerfile for odin.library. V2.7 2-Sep-90 */
  379. X
  380. X#ifndef ODIN_H
  381. X#define ODIN_H 1
  382. X
  383. X#ifndef EXEC_NODES_H
  384. X#include "exec/nodes.h"
  385. X#endif
  386. X#ifndef EXEC_LISTS_H
  387. X#include "exec/lists.h"
  388. X#endif
  389. X#ifndef EXEC_PORTS_H
  390. X#include "exec/ports.h"
  391. X#endif
  392. X#ifndef EXEC_SEMAPHORES_H
  393. X#include "exec/semaphores.h"
  394. X#endif
  395. X#ifndef EXEC_LIBRARIES_H
  396. X#include "exec/libraries.h"
  397. X#endif
  398. X#ifndef EXEC_TASKS_H
  399. X#include "exec/tasks.h"
  400. X#endif
  401. X#ifndef LIBRARIES_DOSEXTENS_H
  402. X#include "libraries/dosextens.h"
  403. X#endif
  404. X
  405. X#define ODINNAME "odin.library"
  406. X
  407. Xstruct OdinBase {
  408. X    struct Library        odin_LibNode;
  409. X    BPTR            odin_SegList;
  410. X    UBYTE            odin_Flags;
  411. X    /* You MUST ObtainSemaphore() this before using 
  412. X     * the WaitList!
  413. X     */ 
  414. X    struct SignalSemaphore    odin_Sem;    /* signal semaphore */
  415. X    struct MinList        odin_WaitList;
  416. X};
  417. X
  418. X#define odin_Sizeof sizeof(struct OdinBase)
  419. X
  420. X/* prefix for envelopes */
  421. X
  422. Xtypedef struct _Env {
  423. X    struct MinNode    e_link;        /* first a link for use in e-space */
  424. X    STRPTR        e_name;        /* the name of this envelope */
  425. X    ULONG        e_len;        /* bytelength of whole envelope */
  426. X    struct _Env *    (*e_copyfunc)();/* opt. C-function for copying */
  427. X    struct _Env *    (*e_proc)();    /* C-func. to call in Eval() */
  428. X} Envelope;
  429. X
  430. X#define e_sizeof (ULONG)sizeof(Envelope)
  431. X
  432. X/* wait-structure used in WaitList. Used internally */
  433. X
  434. Xstruct WaitStruct {
  435. X    struct MinNode    ow_link;
  436. X    Envelope    *ow_envelope;
  437. X    struct Task    *ow_waittask;
  438. X    UBYTE        ow_sigbit;
  439. X    BYTE        ow_type;
  440. X};
  441. X
  442. X#define ow_replyport ow_waittask
  443. X#define ow_sizeof (ULONG)sizeof(struct WaitStruct)
  444. X
  445. X/* ow_types (used internally) */
  446. X
  447. X#define RD_REQUEST 0
  448. X#define IN_REQUEST 1
  449. X#define ASYNCIN_REQUEST 2
  450. X#define ASYNCRD_REQUEST 3
  451. X
  452. X/* the et parameter to Eval() */
  453. X
  454. X#define EVAL_PROCESS (long)0
  455. X#define EVAL_TASK    (long)1
  456. X
  457. X/* the struct put to a MsgPort by AsyncIn/Rd */
  458. X
  459. Xstruct EnvMsg {
  460. X    struct Message    em_msg;
  461. X    Envelope    *em_env;    /* ptr to the returned envelope */
  462. X};
  463. X
  464. X#ifndef ANSI
  465. X/* function returntypes */
  466. X#define NoCopyFunc 0L
  467. Xextern Envelope *In(),*Rd(),*Rdp(),*Inp();
  468. Xextern void Out();
  469. Xextern BOOL CopyOut();
  470. Xextern struct Task *Eval();
  471. Xextern struct Task *StartTask();
  472. Xextern struct Process *StartProcess();
  473. Xextern Envelope *AwaitNamedEnvelope();
  474. Xextern Envelope *PollNamedEnvelope();
  475. Xextern BOOL OutEmptyEnvelope();
  476. Xextern Envelope *CreateEnvelope(),*InitEnvelope();
  477. Xextern void DisposeEnvelope();
  478. X/* version 2 additions */
  479. Xextern Envelope *TimedIn(), *TimedRd();
  480. Xextern void AsyncIn(), AsyncRd();
  481. Xextern Envelope *AwaitTimed();
  482. Xextern void AsyncRequest();
  483. Xextern char *UniqueName();
  484. X
  485. X#else
  486. X/* ANSI function-prototypes, worked with PDC 3.33 */
  487. X#define NoCopyFunc (Envelope *(*cf)())0L
  488. Xextern Envelope *In(Envelope *);
  489. Xextern Envelope *Rd(Envelope *);
  490. Xextern Envelope *Rdp(Envelope *);
  491. Xextern Envelope *Inp(Envelope *);
  492. Xextern void Out(Envelope *);
  493. Xextern BOOL CopyOut(Envelope *);
  494. Xextern struct Task *Eval(Envelope *,long,ULONG,long);
  495. Xextern struct Task *StartTask(void(),char *,long,long);
  496. Xextern struct Process *StartProcess(void(),char *,long,long);
  497. Xextern Envelope *AwaitNamedEnvelope(char *);
  498. Xextern Envelope *PollNamedEnvelope(char *);
  499. Xextern BOOL OutEmptyEnvelope(char *);
  500. Xextern Envelope *CreateEnvelope(char *,ULONG);
  501. Xextern Envelope *InitEnvelope(Envelope *,char *,ULONG,Envelope *(*copyfunc)());
  502. Xextern void DisposeEnvelope(Envelope *);
  503. X/* version 2 additions */
  504. Xextern Envelope *TimedIn(Envelope *,ULONG,ULONG);
  505. Xextern Envelope *TimedRd(Envelope *,ULONG,ULONG);
  506. Xextern void AsyncIn(Envelope *,struct MsgPort *);
  507. Xextern void AsyncRd(Envelope *,struct MsgPort *);
  508. Xextern Envelope *AwaitTimed(char *,ULONG,ULONG);
  509. Xextern void AsyncRequest(char *,struct MsgPort *);
  510. Xextern char *UniqueName(char *);
  511. X#endif /* ANSI */
  512. X
  513. X#endif /* ODIN_H */
  514. END_OF_FILE
  515. if test 3659 -ne `wc -c <'odin.h'`; then
  516.     echo shar: \"'odin.h'\" unpacked with wrong size!
  517. fi
  518. # end of 'odin.h'
  519. fi
  520. if test -f 'odin.i' -a "${1}" != "-c" ; then 
  521.   echo shar: Will not clobber existing file \"'odin.i'\"
  522. else
  523. echo shar: Extracting \"'odin.i'\" \(1282 characters\)
  524. sed "s/^X//" >'odin.i' <<'END_OF_FILE'
  525. X;odin2.i
  526. X;includefile for odin.library.
  527. X;using semaphore instead of spacemanager
  528. X;Last updated 27-aug-90
  529. X;Version = 2.3
  530. X
  531. X    IFND    ODIN_I
  532. XODIN_I    EQU    1
  533. X
  534. XodinNAME    MACRO
  535. X    DC.B    'odin.library',0
  536. X    CNOP    0,2
  537. X    ENDM
  538. X
  539. X    STRUCTURE odin,LIB_SIZE
  540. X    APTR    odin_SegList
  541. X    UBYTE    odin_Flags
  542. X    UBYTE    odin_pad
  543. X    ;------------------------------------------------
  544. X    ;- You must ObtainSemaphore() this before using
  545. X    ;- WaitList!
  546. X    ;------------------------------------------------
  547. X    STRUCT    odin_Sem,SS_SIZE        ;signal semaphore
  548. X    STRUCT    odin_WaitList,MLH_SIZE
  549. X    LABEL    odin_Sizeof
  550. X
  551. X;--- prefix for envelopes
  552. X
  553. X    STRUCTURE    Envelope,MLN_SIZE    ;first a link for use in e-space
  554. X    APTR    e_name        ;ptr to ASCIIZ string
  555. X    ULONG    e_len        ;bytelength of contents
  556. X    APTR    e_copyfunc    ;opt. C-function for copying
  557. X    APTR    e_proc        ;C-function to call in Eval
  558. X    LABEL    e_sizeof
  559. X
  560. X;--- wait-structure used in WaitList
  561. X
  562. X    STRUCTURE    WaitStruct,MLN_SIZE
  563. X    APTR    ow_envelope
  564. X    APTR    ow_waittask
  565. X    UBYTE    ow_sigbit
  566. X    BYTE    ow_type
  567. X    LABEL    ow_sizeof
  568. X
  569. Xow_replyport    EQU    ow_waittask
  570. X
  571. X;--- ow_types
  572. X
  573. XRD_REQUEST    EQU    0
  574. XIN_REQUEST    EQU    1
  575. XASYNCIN_REQUEST    EQU    2
  576. XASYNCRD_REQUEST    EQU    3
  577. X
  578. X;--- the et parameter to Eval()
  579. X
  580. XEVAL_PROCESS    EQU    0
  581. XEVAL_TASK        EQU    1
  582. X
  583. X;--- the struct put to a MsgPort by AsyncIn/AsyncRd
  584. X
  585. X    STRUCTURE    EnvMsg,MN_SIZE
  586. X    APTR    em_env;
  587. X    LABEL    em_sizeof
  588. X
  589. X    ENDC    !ODIN_I
  590. END_OF_FILE
  591. if test 1282 -ne `wc -c <'odin.i'`; then
  592.     echo shar: \"'odin.i'\" unpacked with wrong size!
  593. fi
  594. # end of 'odin.i'
  595. fi
  596. if test -f 'odin.uu' -a "${1}" != "-c" ; then 
  597.   echo shar: Will not clobber existing file \"'odin.uu'\"
  598. else
  599. echo shar: Extracting \"'odin.uu'\" \(5666 characters\)
  600. sed "s/^X//" >'odin.uu' <<'END_OF_FILE'
  601. Xbegin 666 odin.library
  602. XM```#\P`````````$``````````,```-2````%0````\```#D```#Z0```U)P+
  603. XM"DYU2OP````$```-2(`""0`````>````+````$IO9&EN+FQI8G)A<GD``&]DK
  604. XM:6XN;&EB<F%R>2`R+C<@*#(@4V5P(#DP*0T*`````&(```!:````Q@```/(`P
  605. XM``%T```!@@```90```'<```'*````>````=8```%1```!C@```'P```"A@``9
  606. XM`S8```=N```$=```!+(```3J```&V```!O8```<4```'E```")8```FP```*[
  607. XM1```"NH```L0```+0O_____@```,"0#````*````'N````X&`-```!0``M``C
  608. XM`!8`!\```!@````L`````"\-*D`CP`````0K2``B0_D`````<`!.KOW8(\``C
  609. XM````9@HN/(`#@`=.KO^40>T`*$ZN_=)![0!6((A8D$*H``0A2``(0?D````()
  610. XM,#P`/R"(6)!"J``$(4@`"$'H``Q1R/_N0?D```,(3J[]TD'Y```#AD*00J@`D
  611. XM!!#\`#`@#2I?3G4(K@`#`"92;@`@(`Y.=7``4VX`(&8(""X``P`F80).=4CG<
  612. XM(`8J3BQX``1*;0`@9PH([0`#`"9P`&`H)"T`(B)-3J[_!")Y`````$ZN_F)PL
  613. XM`")-,"T`$)+`T&T`$DZN_RX@`DS?8`1.=7``3G4C2``((T``#"-*`!`@"4YU8
  614. XM2.<`)BI.)$DL>``$0>T`*$ZN_<P@2F$`"<9*@&<680`)^B1`0>T`*$ZN_<8@;
  615. XM"DS?9`!.=4_O_^XO2@`(+VX!%``,'WP``0`1</].KOZV(D\30``00>T`5D'H3
  616. XM``0@*``$(4D`!"*((T``!"!`((E![0`H3J[]QA(O`!!P``/`3J[^PG``$"\`<
  617. XM$$ZN_K`@+P`(3^\`$F"82.<`)BI.)$DL>``$0>T`*$ZN_<P@2F$`"3!*@&<LW
  618. XM($`B2DS?9`!A``EL2.<`!BIY````!"QX``1![0`H*D!.KOW&(`U,WV``3G5/^
  619. XM[__N+TH`""]N`10`#!]\````$7#_3J[^MB)/$T``$$'M`%9!Z``$("@`!"%)A
  620. XM``0BB"-```0@0"")0>T`*$ZN_<82+P`0<`'CJ$ZN_L)P`!`O`!!.KOZP("\`T
  621. XM"$_O`!),WV0`3G5(YP`^*DXD22QX``1![0`H3J[]S")J``AA``A@($DB2D'H:
  622. XM``0@*``$(4D`!"*((T``!"!`((E'[0!6)E-*DV<``/`@:P`((&@`"")J``BSY
  623. XMR&<*$!BP&6;B2@!F]B)+*$DF42!1(FD`!"*((4D`!$*4$"P`$0P```%F'BE*L
  624. XM``@@"F$`"%(2+``0<`'CJ")L``Q.KOZ\8```F@P```!F,$CG`#X@2B)L``A,<
  625. XM[WP``!1A``@T3-]\`"E```@2+``0<`'CJ")L``Q.KOZ\8`#_<`P```)F)&$`6
  626. XM"1(O`"`*80`']B!L``PB7R-``!1.KOZ2(DQP$DZN_RY@.$CG`#X@2B)L``A,8
  627. XM[WP``!1A``?:3-]\`"\`80`(U")`(&P`#"-?`!1.KOZ2(DQP$DZN_RY@`/\.V
  628. XM0>T`*$ZN_<9,WWP`3G4O"B1)(FH`"$'Z`!1*@F8&3J[_RF`$3J[_T"1?3G4OI
  629. XM"DAZ``@O*@`43G58CR)`2H!G"BQY````!$[N_[A.=4CG`"8J3B1)+'@`!$'MW
  630. XM`"A.KOW,($IA``<$2H!G%F$`!S@D0$'M`"A.KOW&(`I,WV0`3G5P`&#J2.<`(
  631. XM)BI.)$DL>``$0>T`*$ZN_<P@2F$`!LQ*@&800>T`*$ZN_<9P`$S?9`!.=2!`B
  632. XM(DI,WV0`80`&^$CG``8L>``$*GD````$0>T`*"I`3J[]QB`-3-]@`$YU2.?`'
  633. XMPBQX``1!^0```PA.KOW,3-]#`TCY?_\```,X2.<X.B/(```#>"9)*``F`2QX(
  634. XM``1!^0```!HA0P`43J[_(@B``!]F``":(\````.`)$`D*@`0)&H`&!5\``$`T
  635. XM"!5$``DE2P`*)4(`.M2#)4(`/E6")4(`-D'J`$H@B%B00J@`!"%(``@1?``*P
  636. XM``QP_TZN_K83P````S9K/"/N`10```-\,_P``0```X0B2BA*1?D`````E\M.&
  637. XMKO[F$CD```,V<`'CJ$ZN_L)P`!`Y```#-DZN_K!@#"!Y```#@$ZN_QR9S$'YH
  638. XM```#"$ZN_<8@#$S?7!Q.=4CGP,(L>``$0?D```,(3J[]S$S?0P-(^7__```#R
  639. XM.$CG/`(CR````W@H`2H))``L>``$</].KOZV$\````,V:UPC[@$4```#?$)Y%
  640. XM```#A"8\_____.2++'D`````(@5.KO]V)`!G)`2"````7"QX``02.0```S9P[
  641. XM``/`3J[^PG``$#D```,V3J[^L$'Y```#"$ZN_<8@`DS?0#Q.=70`8.HO"D_O@
  642. XM_^@B3W`8E<I.KO_<(D!.KO_$3^\`&"1?3G4O"D_O_^@B3W`8E<I.KO_<(D!.0
  643. XMKO^F3^\`&"1?3G5P&$ZN_^(B0$J`9P9.KO^X<`%.=2\*2.>`@BQX``0B/``!%
  644. XM``%.KO\Z(D!*@&<.3-]!`97*3J[_W"1?3G5,WT$!<`!@]"`)9Q`@*0`,+PXL/
  645. XM>``$3J[_+BQ?3G4O"2!I``@@*0`,3J[_XB)?2H!G$"!)(D!A``22(D!.KO^X'
  646. XM<`%.=4CG,"8D`"8!*DXD22QX``1![0`H3J[]S"!*80`$'DJ`9Q9A``12)`!!\
  647. XM[0`H3J[]QB`"3-]D#$YU3^__[B]*``@O;@$4``P??``!`!%P_TZN_K8?0``0Y
  648. XM(D]![0!60>@`!"`H``0A20`$(H@C0``$($`@B4'M`"A.KOW&80`$+B1)L_P`Z
  649. XM````9W`E0@`@)4,`)#5\``D`'$ZN_C(2+P`0<``#P"0`(&H`#A(H``\#P$ZNT
  650. XM_L+`@F8F0J\`"$'M`"A.KOW,2I=G#B)/(%$B:0`$(H@A20`$0>T`*$ZN_<8BX
  651. XM2F$`!"YP`!`O`!!.KOZP("\`"$_O`!)@`/\\+WS_____``A@N$CG,"8D`"8!?
  652. XM*DXD22QX``1![0`H3J[]S"!*80`#'$J`9RP@0")*3-]D#&$``UA(YP`&*GD`J
  653. XM```$+'@`!"I`0>T`*$ZN_<8@#4S?8`!.=4_O_^XO2@`(+VX!%``,'WP````1\
  654. XM</].KOZV'T``$")/0>T`5D'H``0@*``$(4D`!"*((T``!"!`((E![0`H3J[]3
  655. XMQF$``Q8D2;/\`````&=R)4(`("5#`"0U?``)`!Q.KOXR$B\`$'```\`D`"!J\
  656. XM``X2*``/`\!.KO["P()F)D*O``A![0`H3J[]S")/2I%G#"!1(FD`!"*((4D`+
  657. XM!$'M`"A.KOW&(DIA``,6<``0+P`03J[^L"`O``A/[P`23-]D#$YU+WS_____4
  658. XM``A@MDCG`#XJ3B9()$DL>``$0>T`*$ZN_<P@2F$``@1*@&<H+P!A``-**$`@P
  659. XM'V$``BXI0``4($LB3$ZN_I)![0`H3J[]QDS??`!.=7`2(CP``0`!3J[_.B)`*
  660. XM2H!G*B-*``@C2P`,$WP``@`10>T`5D'H``0@*``$(4D`!"*((T``!"!`((E@1
  661. XMMB\'+CP``0``3J[_E"X?8*9(YP`^*DXF2"1)+'@`!$'M`"A.KOW,($IA``%PX
  662. XM2H!G.B\`80`"MBA`(!](YP`^($`B2DSO?```%&$``9Q,WWP`*4``%"!+(DQ.G
  663. XMKOZ20>T`*$ZN_<9,WWP`3G5P$B(\``$``4ZN_SHB0$J`9RHC2@`((TL`#!-\/
  664. XM``,`$4'M`%9!Z``$("@`!"%)``0BB"-```0@0"")8+8O!RX\``$``$ZN_Y0N-
  665. XM'V"F+PI/[__H(D](Y\``<!B5RDZN_]PB0$S?``-.KO^(3^\`&"1?3G4B3R\`P
  666. XM<!A.KO_B2H!G"B)`(%].KO]\3G5(YP$"+CP``0``+'@`!$ZN_Y1,WT"`6(].O
  667. XM=4CG`((L>``$+PA!^0```PA.KOW,(%]*&&;\4XA#^0```X80$68$$#P`,%(`+
  668. XM#```.F8&$OP`06`:#```6V8&$OP`86`.#```>V8&$OP`,$H!#^0```X80U
  669. XMV6;\0?D```,(3J[]QDS?00`@"$YU<`!R`!(99P30`6#X`D``/\#\``Q#^0``\
  670. XM``C3P$YU2.<`,"1((FH`"&'6L^D`"&<B(E$@:0`()FH`"+?(9PH0&+`;9@A*8
  671. XM`&;V(`E@"")12I%FX'``3-\,`$YU(D`@42)I``0BB"%)``1.=4JH`!!F$"`HH
  672. XM``PB"1+84X!F^B`!3G4O"2\((&@`$$Z04(].=4CG`"(L>``$80``BB1`2H!GX
  673. XM2G`H(CP``0`!3J[_.DJ`9S8O`")`0?D````,<`%R`$ZN_D1*@&88(E\3?``%S
  674. XM``@C2@`.,WP`*``23-]$`$YU(E]P*$ZN_RXB2F%HD\E,WT0`3G6S_`````!FX
  675. XM`DYU+PXL>``$+PE.KOX@(E=.KOX^(E<B:0`.83PB7W`H3J[_+BQ?3G4O"W`BX
  676. XM(CP``0`!3J[_.B9`2H!G&"=N`10`$'#_3J[^MA=```\B2TZN_IX@"R9?3G4OJ
  677. XM"4ZN_I@B5W``$"D`#TZN_K`B7W`B3J[_+DYU<!@B/``!``%.KO\Z2H!G"B!`M
  678. XM,7P`&``23G4O!RX\``$``$ZN_Y0N'TYU```#[````"0`````````!@````H`]
  679. XM```2````%@```!H```!.````4@```%8```!:````7@```&(```!F````:@``B
  680. XM`&X```!R````=@```'H```!^````@@```(8```"*````C@```)(```"6````6
  681. XMF@```)X```"B````I@```*H```"N````L@```+8```"Z````O@```-````#JR
  682. XM`````@````$```7T```&B`````,````"```!`@``!7@```QF````)`````,`H
  683. XM``#X```!#@```3@```%6```!8````;H```*V```$J```!2X```5.```%7@```
  684. XM!6@```6.```%V```!>(```7J```&````!A````8<```&*```!D(```92```&%
  685. XM7```!G(```9\```&@@``!I````:J```&N@``!L0```C*```+3@``"V````N6E
  686. XM```+H```"\8````````#\@```^D````5+'@`!$IY```#A&<D(&X!%$'H`$HBG
  687. XM>0```X!!Z``$("@`!"%)``0BB"-```0@0"")+SD```-X$CD```,V<`'CJ")Y[
  688. XM```#?$ZN_KQ,^7__```#.$YU```#[`````8````#````!@```!8````R````\
  689. XM.````$(```!.`````````_(```/J````#V1O<RYL:6)R87)Y`'1I;65R+F1EZ
  690. XM=FEC90`````````````*`````````@````$```````$``0```%Q.<0```_(`&
  691. X+``/K````Y````_(`'
  692. X``
  693. Xend
  694. Xsize 4016
  695. END_OF_FILE
  696. if test 5666 -ne `wc -c <'odin.uu'`; then
  697.     echo shar: \"'odin.uu'\" unpacked with wrong size!
  698. fi
  699. # end of 'odin.uu'
  700. fi
  701. if test -f 'odin_lib.fd' -a "${1}" != "-c" ; then 
  702.   echo shar: Will not clobber existing file \"'odin_lib.fd'\"
  703. else
  704. echo shar: Extracting \"'odin_lib.fd'\" \(921 characters\)
  705. sed "s/^X//" >'odin_lib.fd' <<'END_OF_FILE'
  706. X*---- odin_lib.fd 
  707. X*---- version.revision = 2.7
  708. X##base _OdinBase
  709. X##bias 30
  710. X##public
  711. X*---- basic functions
  712. XCreateEnvelope(name,size)(A0,D0)
  713. XInitEnvelope(envelope,name,len,copyfunc)(A1,A0,D0,A2)
  714. XDisposeEnvelope(envelope)(A1)
  715. X*---- creation of tasks/processes from procedures
  716. XStartTask(procedure,name,pri,stacksize)(A0/A1,D0/D1)
  717. XStartProcess(procedure,name,pri,stacksize)(A0/A1,D0/D1)
  718. X*---- Linda-like functions
  719. XIn(envelope)(A1)
  720. XRd(envelope)(A1)
  721. XOut(envelope)(A1)
  722. XCopyOut(envelope)(A1)
  723. XEval(envelope,pri,stacksize,et)(A1,D0/D1/D2)
  724. XInp(envelope)(A1)
  725. XRdp(envelope)(A1)
  726. X*---- ease-of-use functions
  727. XAwaitNamedEnvelope(name)(A0)
  728. XPollNamedEnvelope(name)(A0)
  729. XOutEmptyEnvelope(name)(A0)
  730. X*---- version 2 additions
  731. XTimedIn(env,secs,micros)(A1,D0/D1)
  732. XTimedRd(env,secs,micros)(A1,D0/D1)
  733. XAsyncIn(env,port)(A1,A0)
  734. XAsyncRd(env,port)(A1,A0)
  735. XAwaitTimed(name,secs,micros)(A0,D0/D1)
  736. XAsyncRequest(name,port)(A0,D0)
  737. XUniqueName(buffer)(A0)
  738. X##end
  739. END_OF_FILE
  740. if test 921 -ne `wc -c <'odin_lib.fd'`; then
  741.     echo shar: \"'odin_lib.fd'\" unpacked with wrong size!
  742. fi
  743. # end of 'odin_lib.fd'
  744. fi
  745. if test -f 'odindemo1.c' -a "${1}" != "-c" ; then 
  746.   echo shar: Will not clobber existing file \"'odindemo1.c'\"
  747. else
  748. echo shar: Extracting \"'odindemo1.c'\" \(3331 characters\)
  749. sed "s/^X//" >'odindemo1.c' <<'END_OF_FILE'
  750. X/***********************************************/
  751. X/* odindemo1.c                                 */
  752. X/* demo of odin.library                        */
  753. X/* starts 2 new processes and sends envelopes  */
  754. X/* back and forth.                             */
  755. X/* Created 7-Jul-90 by Peter Oerbaek           */
  756. X/* This code is in the public domain.          */
  757. X/* Link with odinglue.o                        */
  758. X/***********************************************/
  759. X
  760. X/**********************************************************************
  761. X  A lot of checking is ommited in the code to make it smaller and
  762. X  easier to read.
  763. X**********************************************************************/
  764. X
  765. X#include    "exec/types.h"
  766. X#include    "exec/semaphores.h"
  767. X#include    "stdio.h"
  768. X#include    "odin.h"
  769. X
  770. Xstruct OdinBase *OpenLibrary();
  771. Xstruct OdinBase *OdinBase;    /* global base pointer */
  772. X
  773. Xtypedef struct {
  774. X    Envelope    env;    /* envelope-prefix used by odin routines */
  775. X    int        num;    /* package number */
  776. X    int        stop;    /* flag to stop consumers */
  777. X} Pack;
  778. X
  779. X#define p_sizeof (long)sizeof(Pack)
  780. X
  781. Xtypedef struct {
  782. X    Envelope    e;        /* envelope-prefix */
  783. X    char        *windowname;    /* name of windowfile to open */
  784. X} StartEnv;
  785. X
  786. X#define se_sizeof (long)sizeof(StartEnv)
  787. X
  788. X/*** for use around C routines that are not re-entrant ***/
  789. X
  790. Xstruct SignalSemaphore    ss;
  791. X#define CRIT_REG(s) ObtainSemaphore(&ss); { s } ReleaseSemaphore(&ss);
  792. X
  793. X/**** the body for the processes ************/
  794. X
  795. XEnvelope *processbody(se)
  796. XStartEnv *se;
  797. X{
  798. X    FILE *f;
  799. X    int i,stop;
  800. X    Pack *p;
  801. X
  802. X    CRIT_REG(f = fopen(se->windowname,"w");)
  803. X    CRIT_REG(fprintf(f,"Hello world\n");)
  804. X    do {
  805. X        p = (Pack *)AwaitNamedEnvelope("a packet");
  806. X        stop = p->stop;
  807. X        CRIT_REG(fprintf(f,"Packet #%d received.\n",p->num);)
  808. X        DisposeEnvelope(p);
  809. X    } while(stop == 0);
  810. X    CRIT_REG(fprintf(f,"Bye, bye...\n");)
  811. X    Delay(100L);
  812. X    CRIT_REG(fclose(f);)
  813. X    return (Envelope *)se;
  814. X}
  815. X
  816. Xmain()
  817. X{
  818. X    StartEnv *env;
  819. X    Pack *pack;
  820. X    int i;
  821. X
  822. X    printf("opening library\n");
  823. X    if(!(OdinBase = OpenLibrary("ram:odin.library",0L))) {
  824. X        printf("Couldn't open odin.library\n");
  825. X        exit(20);
  826. X    }
  827. X
  828. X    /* set up semaphore */
  829. X    InitSemaphore(&ss);
  830. X
  831. X    /* Ought to do an AddSemaphore() here, but that doesn't work
  832. X     * in my ROM (KS 33.180)
  833. X     */
  834. X
  835. X    printf("creating new processes\n");
  836. X    /* start first process */
  837. X    env = (StartEnv *)CreateEnvelope("newprocess1",se_sizeof);
  838. X    env->e.e_proc = processbody;
  839. X    env->windowname = "CON:10/10/300/100/Proc1";
  840. X    Eval(env,1L,4000L,EVAL_PROCESS);
  841. X
  842. X    /* start next process */
  843. X    env = (StartEnv *)CreateEnvelope("newprocess2",se_sizeof);
  844. X    env->e.e_proc = processbody;
  845. X    env->windowname = "CON:310/20/300/100/Proc2";
  846. X    Eval(env,0L,4000L,EVAL_PROCESS);
  847. X
  848. X    /* send some packages */
  849. X    for(i = 0; i < 10; i++) {
  850. X        pack = (Pack *)CreateEnvelope("a packet",p_sizeof);
  851. X        pack->num = i;
  852. X        pack->stop = 0;
  853. X        Out(pack);
  854. X        CRIT_REG(printf("packet #%d sent.\n",i);)
  855. X    }
  856. X
  857. X    /* send the stop-packages */
  858. X    CRIT_REG(printf("sending stop-packets.\n");)
  859. X    pack = (Pack *)CreateEnvelope("a packet",p_sizeof);
  860. X    pack->stop = 1;
  861. X    Out(pack);
  862. X
  863. X    pack = (Pack *)CreateEnvelope("a packet",p_sizeof);
  864. X    pack->stop = 1;
  865. X    Out(pack);
  866. X
  867. X    CRIT_REG(printf("waiting for process1 to terminate\n");)
  868. X    DisposeEnvelope(AwaitNamedEnvelope("newprocess1"));
  869. X    CRIT_REG(printf("waiting for process2 to terminate\n");)
  870. X    DisposeEnvelope(AwaitNamedEnvelope("newprocess2"));
  871. X
  872. X    printf("closing\n");
  873. X    CloseLibrary(OdinBase);
  874. X}
  875. X
  876. END_OF_FILE
  877. if test 3331 -ne `wc -c <'odindemo1.c'`; then
  878.     echo shar: \"'odindemo1.c'\" unpacked with wrong size!
  879. fi
  880. # end of 'odindemo1.c'
  881. fi
  882. if test -f 'odinglue.asm' -a "${1}" != "-c" ; then 
  883.   echo shar: Will not clobber existing file \"'odinglue.asm'\"
  884. else
  885. echo shar: Extracting \"'odinglue.asm'\" \(4169 characters\)
  886. sed "s/^X//" >'odinglue.asm' <<'END_OF_FILE'
  887. X;odinglue.asm 
  888. X;Created 4-Jul-90 by Peter Oerbaek
  889. X;Last updated 2-Sep-90 by Peter Oerbaek
  890. X;This is in the public domain.
  891. X;C-interface gluecode for odin.library V2.7
  892. X;Assemble with 'as' for Aztec-C 3.40a or later
  893. X;Assemble with Assem/A68K for Lattice / DICE / PDC
  894. X;Assembles OK as is with A68K 2.6!!!!
  895. X
  896. X;public    macro        ;de-comment this for use with Assem
  897. X;    XDEF    \1
  898. X;    endm
  899. X
  900. X__CreateEnvelope    equ    -30
  901. X__InitEnvelope    equ    -36
  902. X__DisposeEnvelope    equ    -42
  903. X__StartTask    equ    -48
  904. X__StartProcess    equ    -54
  905. X__In        equ    -60
  906. X__Rd        equ    -66
  907. X__Out        equ    -72
  908. X__CopyOut        equ    -78
  909. X__Eval        equ    -84
  910. X__Inp        equ    -90
  911. X__Rdp        equ    -96
  912. X__AwaitNamedEnvelope equ    -102
  913. X__PollNamedEnvelope    equ    -108
  914. X__OutEmptyEnvelope    equ    -114
  915. X
  916. X;--- Version 2 additions
  917. X__TimedIn        equ    -120
  918. X__TimedRd        equ    -126
  919. X__AsyncIn        equ    -132
  920. X__AsyncRd        equ    -138
  921. X__AwaitTimed    equ    -144
  922. X__AsyncRequest    equ    -150
  923. X__UniqueName    equ    -156
  924. X
  925. X    public    _OdinBase        ;for use with Manx 'as'
  926. X;    XREF    _OdinBase        ;for use with Assem
  927. X
  928. X_InitEnvelope:
  929. X    movem.l    a2/a6,-(sp)    ;a6,a2,pc,env,name,len,copyfunc
  930. X    move.l    12(sp),a1
  931. X    move.l    16(sp),a0
  932. X    move.l    20(sp),d0
  933. X    move.l    24(sp),a2
  934. X    move.l    _OdinBase,a6
  935. X    jsr    __InitEnvelope(a6)
  936. X    movem.l    (sp)+,a2/a6
  937. X    rts
  938. X    public _InitEnvelope
  939. X
  940. X_In:
  941. X    moveq.l    #__In,d1
  942. X    bra.s    simplecall
  943. X    public    _In
  944. X
  945. X_Out:
  946. X    moveq.l    #__Out,d1
  947. X    bra.s    simplecall
  948. X    public    _Out
  949. X
  950. X_CopyOut:
  951. X    moveq.l    #__CopyOut,d1
  952. X;    bra.s    simplecall
  953. X    public    _CopyOut
  954. X
  955. Xsimplecall:    ;call with only parameter in A1
  956. X    move.l    a6,-(sp)        ;a6,pc,env
  957. X    move.l    8(sp),a1
  958. X    move.l    _OdinBase,a6
  959. X    jsr    0(a6,d1.l)
  960. X    move.l    (sp)+,a6
  961. X    rts
  962. X    
  963. X_Rd:
  964. X    moveq.l    #__Rd,d1
  965. X    bra.s    simplecall
  966. X    public    _Rd
  967. X
  968. X
  969. X_Inp:
  970. X    moveq.l    #__Inp,d1
  971. X    bra.s    simplecall
  972. X    public    _Inp
  973. X
  974. X_Rdp:
  975. X    moveq.l    #__Rdp,d1
  976. X    bra.s    simplecall
  977. X    public    _Rdp
  978. X
  979. X_Eval:
  980. X    movem.l    d2/a6,-(sp)    ;a6,d2,pc,a1,d0,d1,d2
  981. X    move.l    12(sp),a1
  982. X    movem.l    16(sp),d0-d2
  983. X    move.l    _OdinBase,a6
  984. X    jsr    __Eval(a6)
  985. X    movem.l    (sp)+,d2/a6
  986. X    rts
  987. X    public    _Eval
  988. X
  989. X_StartTask:
  990. X    move.l    a6,-(sp)        ;a6,pc,proc,name,pri,stack
  991. X    movem.l    8(sp),a0/a1
  992. X    movem.l    16(sp),d0/d1
  993. X    move.l    _OdinBase,a6
  994. X    jsr    __StartTask(a6)
  995. X    move.l    (sp)+,a6
  996. X    rts
  997. X    public    _StartTask
  998. X
  999. X_StartProcess:
  1000. X    move.l    a6,-(sp)
  1001. X    movem.l    8(sp),a0/a1
  1002. X    movem.l    16(sp),d0/d1
  1003. X    move.l    _OdinBase,a6
  1004. X    jsr    __StartProcess(a6)
  1005. X    move.l    (sp)+,a6
  1006. X    rts
  1007. X    public    _StartProcess
  1008. X
  1009. X_AwaitNamedEnvelope:
  1010. X    move.l    a6,-(sp)
  1011. X    move.l    8(sp),a0
  1012. X    move.l    _OdinBase,a6
  1013. X    jsr    __AwaitNamedEnvelope(a6)
  1014. X    move.l    (sp)+,a6
  1015. X    rts
  1016. X    public    _AwaitNamedEnvelope
  1017. X
  1018. X_PollNamedEnvelope:
  1019. X    move.l    a6,-(sp)
  1020. X    move.l    8(sp),a0
  1021. X    move.l    _OdinBase,a6
  1022. X    jsr    __PollNamedEnvelope(a6)
  1023. X    move.l    (sp)+,a6
  1024. X    rts
  1025. X    public    _PollNamedEnvelope
  1026. X
  1027. X_OutEmptyEnvelope:
  1028. X    move.l    a6,-(sp)
  1029. X    move.l    8(sp),a0
  1030. X    move.l    _OdinBase,a6
  1031. X    jsr    __OutEmptyEnvelope(a6)
  1032. X    move.l    (sp)+,a6
  1033. X    rts
  1034. X    public    _OutEmptyEnvelope
  1035. X
  1036. X_CreateEnvelope:
  1037. X    move.l    a6,-(sp)        ;a6,pc,name,size
  1038. X    move.l    8(sp),a0
  1039. X    move.l    12(sp),d0
  1040. X    move.l    _OdinBase,a6
  1041. X    jsr    __CreateEnvelope(a6)
  1042. X    move.l    (sp)+,a6
  1043. X    rts
  1044. X    public    _CreateEnvelope
  1045. X
  1046. X_DisposeEnvelope:
  1047. X    move.l    a6,-(sp)
  1048. X    move.l    8(sp),a1
  1049. X    move.l    _OdinBase,a6
  1050. X    jsr    __DisposeEnvelope(a6)
  1051. X    move.l    (sp)+,a6
  1052. X    rts
  1053. X    public    _DisposeEnvelope
  1054. X
  1055. X;--- version 2 additions
  1056. X
  1057. X_TimedIn:
  1058. X    move.l    a6,-(sp)    ;a6,pc,env,secs,micros
  1059. X    move.l    8(sp),a1
  1060. X    movem.l    12(sp),d0-d1
  1061. X    move.l    _OdinBase,a6
  1062. X    jsr    __TimedIn(a6)
  1063. X    move.l    (sp)+,a6
  1064. X    rts
  1065. X    public    _TimedIn
  1066. X
  1067. X_TimedRd:
  1068. X    move.l    a6,-(sp)    ;a6,pc,env,secs,micros
  1069. X    move.l    8(sp),a1
  1070. X    movem.l    12(sp),d0-d1
  1071. X    move.l    _OdinBase,a6
  1072. X    jsr    __TimedRd(a6)
  1073. X    move.l    (sp)+,a6
  1074. X    rts
  1075. X    public    _TimedRd
  1076. X
  1077. X_AsyncIn:
  1078. X    move.l    a6,-(sp)    ;a6,pc,env,port
  1079. X    move.l    8(sp),a1
  1080. X    move.l    12(sp),a0
  1081. X    move.l    _OdinBase,a6
  1082. X    jsr    __AsyncIn(a6)
  1083. X    move.l    (sp)+,a6
  1084. X    rts
  1085. X    public    _AsyncIn
  1086. X
  1087. X_AsyncRd:
  1088. X    move.l    a6,-(sp)    ;a6,pc,env,port
  1089. X    move.l    8(sp),a1
  1090. X    move.l    12(sp),a0
  1091. X    move.l    _OdinBase,a6
  1092. X    jsr    __AsyncRd(a6)
  1093. X    move.l    (sp)+,a6
  1094. X    rts
  1095. X    public    _AsyncRd
  1096. X
  1097. X_AwaitTimed:
  1098. X    move.l    a6,-(sp)    ;a6,pc,name,secs,micros
  1099. X    move.l    8(sp),a0
  1100. X    movem.l    12(sp),d0/d1
  1101. X    move.l    _OdinBase,a6
  1102. X    jsr    __AwaitTimed(a6)
  1103. X    move.l    (sp)+,a6
  1104. X    rts
  1105. X    public    _AwaitTimed
  1106. X
  1107. X_AsyncRequest:
  1108. X    move.l    a6,-(sp)    ;a6,pc,name,port
  1109. X    move.l    8(sp),a0
  1110. X    move.l    12(sp),d0
  1111. X    move.l    _OdinBase,a6
  1112. X    jsr    __AsyncRequest(a6)
  1113. X    move.l    (sp)+,a6
  1114. X    rts
  1115. X    public    _AsyncRequest
  1116. X
  1117. X_UniqueName:
  1118. X    move.l    a6,-(sp)    ;a6,pc,buffer
  1119. X    move.l    8(sp),a0
  1120. X    move.l    _OdinBase,a6
  1121. X    jsr    __UniqueName(a6)
  1122. X    move.l    (sp)+,a6
  1123. X    rts
  1124. X    public    _UniqueName
  1125. X
  1126. X    end
  1127. X
  1128. END_OF_FILE
  1129. if test 4169 -ne `wc -c <'odinglue.asm'`; then
  1130.     echo shar: \"'odinglue.asm'\" unpacked with wrong size!
  1131. fi
  1132. # end of 'odinglue.asm'
  1133. fi
  1134. if test -f 'odintest.c' -a "${1}" != "-c" ; then 
  1135.   echo shar: Will not clobber existing file \"'odintest.c'\"
  1136. else
  1137. echo shar: Extracting \"'odintest.c'\" \(6800 characters\)
  1138. sed "s/^X//" >'odintest.c' <<'END_OF_FILE'
  1139. X/***********************************************************
  1140. X* odintest.c                                               *
  1141. X* Created 12-Jul-90 by Peter Oerbaek                       *
  1142. X* This is supposed to be a complete test-suite of the      *
  1143. X* functions in odin.library                                *
  1144. X* Modified 13-Jul-90 for ANSI compatibility                *
  1145. X* Modified 23-Aug-90 for testing of version 2              *
  1146. X************************************************************/
  1147. X
  1148. X#include    "exec/types.h"
  1149. X#include    "exec/tasks.h"
  1150. X#include    "exec/semaphores.h"
  1151. X#include    "exec/execbase.h"
  1152. X#include    "odin.h"
  1153. X#include    "stdio.h"
  1154. X
  1155. Xvoid *OpenLibrary();
  1156. Xstruct Task *FindTask();
  1157. Xstruct Message *GetMsg();
  1158. Xvoid WaitPort(),FreeMem(),DeletePort();
  1159. Xstruct MsgPort *CreatePort();
  1160. X
  1161. Xstruct OdinBase *OdinBase;
  1162. Xstruct SignalSemaphore ss;
  1163. X#define CR(s) ObtainSemaphore(&ss); { s } ReleaseSemaphore(&ss);
  1164. X#define debug(str) CR(printf(str);)
  1165. X
  1166. XEnvelope e1,e2,e3,e4;
  1167. X
  1168. Xstruct MsgPort *mp;
  1169. Xstruct EnvMsg *msg;
  1170. X
  1171. XEnvelope *my_copyfunc(src,tar)
  1172. XEnvelope *src,*tar;
  1173. X{
  1174. X    int i;
  1175. X    register char *a,*b;
  1176. X
  1177. X    a = (char *)src; b = (char *)tar;
  1178. X    for(i = 0; i < e_sizeof; i++) {
  1179. X        *a++ = *b++;
  1180. X    }
  1181. X
  1182. X    return tar;
  1183. X}
  1184. X
  1185. XEnvelope *process1(e)
  1186. XEnvelope *e;
  1187. X{
  1188. X    struct Task *tsk;
  1189. X    Envelope *env;
  1190. X
  1191. X    debug("process1 started\n");
  1192. X    CR(printf("lenght = %ld\n",e->e_len);)
  1193. X
  1194. X    tsk = FindTask(NULL);
  1195. X    
  1196. X    CR(printf("stacksize = %d\n",(int)(tsk->tc_SPUpper - tsk->tc_SPLower));)
  1197. X    CR(printf("pri = %d\n",(int)tsk->tc_Node.ln_Pri);)
  1198. X    CR(printf("taskname=%s\n",tsk->tc_Node.ln_Name);)
  1199. X
  1200. X    debug("creating envelope\n");
  1201. X    env = CreateEnvelope("Env2",e_sizeof);
  1202. X    if(env == NULL) { debug("create returned NULL\n"); return e; }
  1203. X
  1204. X    debug("envelope created\n");
  1205. X
  1206. X    Delay(100L);
  1207. X    debug("copyouting\n");
  1208. X    CopyOut(env);
  1209. X
  1210. X    Delay(199L);
  1211. X    debug("copy outing with copyfunc\n");
  1212. X    env->e_copyfunc = my_copyfunc;
  1213. X    CopyOut(env);
  1214. X
  1215. X    debug("normal out\n");
  1216. X    Out(env);
  1217. X
  1218. X    debug("wait for V3\n");
  1219. X    while(!(env = PollNamedEnvelope("V3"))) { 
  1220. X        debug("waiting with poll.\n");
  1221. X    }
  1222. X
  1223. X    debug("got V3 dispose\n");
  1224. X    DisposeEnvelope(env);
  1225. X
  1226. X    debug("wait for V4 and dispose\n");
  1227. X    DisposeEnvelope(AwaitNamedEnvelope("V4"));
  1228. X
  1229. X    debug("wait for task1\n");
  1230. X    DisposeEnvelope(AwaitNamedEnvelope("V5"));
  1231. X    debug("shake hands\n");
  1232. X    (void)OutEmptyEnvelope("R1");
  1233. X
  1234. X    (void)OutEmptyEnvelope("envelope3");
  1235. X
  1236. X    Delay(200L);
  1237. X    (void)OutEmptyEnvelope("envelope4");
  1238. X    debug("2 envelopes outed\n");
  1239. X
  1240. X    (void)OutEmptyEnvelope("te1");
  1241. X    Delay(300L);
  1242. X    (void)OutEmptyEnvelope("te2");
  1243. X
  1244. X    debug("te1 and te2 outed\n");
  1245. X
  1246. X    (void)AwaitTimed("never",10L,0L);
  1247. X    debug("awaittaimed timed out after 10 secs\n");
  1248. X
  1249. X    return e;
  1250. X}
  1251. X
  1252. Xvoid task1()
  1253. X{
  1254. X    (void)OutEmptyEnvelope("V5");    /* shake hands with process */
  1255. X    DisposeEnvelope(AwaitNamedEnvelope("R1"));
  1256. X}
  1257. X
  1258. Xmain()
  1259. X{
  1260. X    Envelope *ptr;
  1261. X    struct Task *tsk;
  1262. X    char buffer[30];
  1263. X    int i;
  1264. X
  1265. X    if(!(OdinBase = (struct OdinBase *)OpenLibrary("RAM:odin.library",0L)))
  1266. X    {
  1267. X        printf("couldn't find odin.library.\n");
  1268. X        exit(20);
  1269. X    }
  1270. X
  1271. X    mp = CreatePort("testport",0L);
  1272. X
  1273. X    InitSemaphore(&ss);
  1274. X
  1275. X    debug("begin\n");
  1276. X
  1277. X    debug("test InitEnvelope():\n");
  1278. X    ptr = InitEnvelope(&e1,"Test",e_sizeof,NoCopyFunc);
  1279. X    debug("init envelope finished\n");
  1280. X    if(ptr == &e1) {
  1281. X        debug("returnvalue ok.\n");
  1282. X        if(strcmp(ptr->e_name,"Test") == 0) {
  1283. X            debug("name inited ok\n");
  1284. X        } else {
  1285. X            debug("name wrong\n");
  1286. X        }
  1287. X        if(ptr->e_len == e_sizeof && ptr->e_copyfunc == NULL) {
  1288. X            debug("inited ok\n");
  1289. X        } else {
  1290. X            debug("wrong init\n");
  1291. X        }
  1292. X    } else {
  1293. X        debug("returned wrong value.\n");
  1294. X    }
  1295. X
  1296. X
  1297. X    debug("test Eval():\n");
  1298. X    e1.e_proc = process1;
  1299. X    (void)Eval(&e1,(long)0,(ULONG)8000,EVAL_PROCESS);
  1300. X    debug("eval finished\n");
  1301. X
  1302. X    debug("test rdp\n");
  1303. X    (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  1304. X    while(!(ptr = Rdp(&e2))) { debug("waiting in rdp\n"); }
  1305. X    if(ptr == &e2) {
  1306. X        debug("rdp returned ok\n");
  1307. X    } else {
  1308. X        debug("rdp returned wrong\n");
  1309. X    }
  1310. X    CR(printf("name returned by rdp: %s\n",e2.e_name);)
  1311. X
  1312. X    debug("test rd\n");
  1313. X    (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  1314. X    ptr = Rd(&e2);
  1315. X    if(ptr == &e2) {
  1316. X        debug("rd returned ok\n");
  1317. X    } else {
  1318. X        debug("rd returned wrong\n");
  1319. X    }
  1320. X    CR(printf("name returned by rd: %s\n",ptr->e_name);)
  1321. X
  1322. X    debug("test In()\n");
  1323. X    (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  1324. X    ptr = In(&e2);
  1325. X    if(ptr != &e2) {
  1326. X        debug("in returned ok\n");
  1327. X    } else {
  1328. X        debug("in returned wrong\n");
  1329. X    }
  1330. X    CR(printf("name returned by in: %s\n",ptr->e_name);)
  1331. X    DisposeEnvelope(ptr);
  1332. X
  1333. X    debug("test AwaitNamedEnvelope()\n");
  1334. X    ptr = AwaitNamedEnvelope("Env2");
  1335. X    CR(printf("name returned by Await..: %s\n",ptr->e_name);)
  1336. X    DisposeEnvelope(ptr);
  1337. X
  1338. X    debug("test rdp with copyfunc\n");
  1339. X    (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  1340. X    while(!(ptr = Rdp(&e2))) { debug("waiting in rdp2\n"); }
  1341. X    if(ptr == &e2) {
  1342. X        debug("rdp2 returned ok\n");
  1343. X    } else {
  1344. X        debug("rdp2 returned wrong\n");
  1345. X    }
  1346. X    CR(printf("name returned by rdp2: %s\n",e2.e_name);)
  1347. X
  1348. X    debug("rd with copyfunc\n");
  1349. X    (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  1350. X    ptr = Rd(&e2);
  1351. X    if(ptr == &e2) {
  1352. X        debug("rd2 returned ok\n");
  1353. X    } else {
  1354. X        debug("rd2 returned wrong\n");
  1355. X    }
  1356. X    CR(printf("name returned by rd2: %s\n",e2.e_name);)
  1357. X
  1358. X    DisposeEnvelope(AwaitNamedEnvelope("Env2"));
  1359. X
  1360. X    Delay(100L);
  1361. X    Out(CreateEnvelope("V3",e_sizeof));
  1362. X
  1363. X    (void)OutEmptyEnvelope("V4");
  1364. X
  1365. X    tsk = StartTask(task1,"Task1",0L,4000L);
  1366. X    if(tsk == NULL) { debug("couldn't start task\n"); }
  1367. X    debug("task started\n");
  1368. X
  1369. X    /*** version 2 additions ***/
  1370. X
  1371. X    (void)InitEnvelope(&e3,"envelope3",e_sizeof,NoCopyFunc);
  1372. X
  1373. X    /* wait max 5 secs */
  1374. X    ptr = TimedRd(&e3,5L,0L);
  1375. X    if(ptr == &e3) {
  1376. X        debug("timedrd returned ok\n");
  1377. X        CR(printf("name returned by TimedRd: %s\n",ptr->e_name);)
  1378. X    } else {
  1379. X        debug("timedrd timed out\n");
  1380. X    }
  1381. X
  1382. X    debug("ready for timedin\n");
  1383. X    ptr = TimedIn(&e3,3L,0L);
  1384. X    if(ptr != 0L) {
  1385. X        debug("timedin returned ok\n");
  1386. X        CR(printf("name returned by TimedIn: %s\n",ptr->e_name);)
  1387. X        DisposeEnvelope(ptr);
  1388. X    } else {
  1389. X        debug("timedin timed out\n");
  1390. X    }
  1391. X    
  1392. X    (void)InitEnvelope(&e4,"envelope4",e_sizeof,NoCopyFunc);
  1393. X    AsyncIn(&e4,mp);
  1394. X
  1395. X    debug("returned from asyncin, waiting\n");
  1396. X
  1397. X    WaitPort(mp);
  1398. X    msg = (struct EnvMsg *)GetMsg(mp);
  1399. X    debug("got message\n");
  1400. X    DisposeEnvelope(msg->em_env);
  1401. X    debug("disposed of envelope\n");
  1402. X    FreeMem(msg,(long)sizeof(struct EnvMsg));
  1403. X    debug("freed message\n");
  1404. X
  1405. X    ptr = AwaitTimed("te1",1L,0L);
  1406. X    if(ptr != 0L) {
  1407. X        debug("te1 arrived\n");
  1408. X        DisposeEnvelope(ptr);
  1409. X    } else {
  1410. X        debug("te1 didn't arrive in time\n");
  1411. X    }
  1412. X
  1413. X    AsyncRequest("te2",mp);
  1414. X    debug("waiting for te2\n");
  1415. X
  1416. X    WaitPort(mp); msg = (struct EnvMsg *)GetMsg(mp);
  1417. X    DisposeEnvelope(msg->em_env); FreeMem(msg,(long)sizeof(struct EnvMsg));
  1418. X
  1419. X    /* generate some unique names */
  1420. X    for(i = 1; i < 200; i++) {
  1421. X        (void)strcpy(buffer,"prefix");
  1422. X        CR(printf("%s\n",UniqueName(buffer));)
  1423. X    }
  1424. X    
  1425. X    debug("wait for process to die\n");
  1426. X    (void)AwaitNamedEnvelope("Test");    
  1427. X    debug("exiting\n");
  1428. X
  1429. X    DeletePort(mp);
  1430. X    CloseLibrary(OdinBase);
  1431. X}
  1432. X
  1433. END_OF_FILE
  1434. if test 6800 -ne `wc -c <'odintest.c'`; then
  1435.     echo shar: \"'odintest.c'\" unpacked with wrong size!
  1436. fi
  1437. # end of 'odintest.c'
  1438. fi
  1439. if test -f 'philosophers.c' -a "${1}" != "-c" ; then 
  1440.   echo shar: Will not clobber existing file \"'philosophers.c'\"
  1441. else
  1442. echo shar: Extracting \"'philosophers.c'\" \(3995 characters\)
  1443. sed "s/^X//" >'philosophers.c' <<'END_OF_FILE'
  1444. X/*****************************************************************/
  1445. X/* philosophers.c                                                */
  1446. X/* demo of some of the features of odin.library 2.5              */
  1447. X/* Created 6-Jun-90                                              */
  1448. X/* Last modified 27-Aug-90                                       */
  1449. X/* Link with odinglue.o                                          */
  1450. X/*****************************************************************/
  1451. X
  1452. X#include    "exec/types.h"
  1453. X#include    "exec/semaphores.h"
  1454. X#include    "stdio.h"
  1455. X#include    "odin.h"
  1456. X
  1457. Xstruct Library *OpenLibrary();
  1458. X
  1459. X#define PHILONUM 4            /* number of philosophers */
  1460. X
  1461. Xstruct OdinBase *OdinBase;        /* the global baseptr */
  1462. X
  1463. X/* structure of allocation-envelope */
  1464. Xstruct Forks {
  1465. X    Envelope e;
  1466. X    BOOL inuse[PHILONUM];
  1467. X};
  1468. X
  1469. X/* argument for the philosopher processes */
  1470. Xstruct PEnv {
  1471. X    Envelope e;
  1472. X    int    num;
  1473. X};
  1474. X
  1475. Xstruct Forks *the_forks;
  1476. Xstruct SignalSemaphore xx;
  1477. X
  1478. X/* protect C-functions that are not re-entrant */
  1479. X#define CR(s) ObtainSemaphore(&xx); { s } ReleaseSemaphore(&xx);
  1480. X#define USE(n) (copy_forks->inuse[n])?printf("%d ",n):printf("  ")
  1481. X
  1482. Xchar s[PHILONUM][20];            /* holds the names */
  1483. X
  1484. X/* make name with single-digit suffix */
  1485. Xchar *philoname(str,name,num)
  1486. Xchar *str,*name;
  1487. Xint  num;
  1488. X{
  1489. X    register char *s2;
  1490. X
  1491. X    s2 = str;
  1492. X    while(*name) *s2++ = *name++;
  1493. X    *s2++ = num  + '0';
  1494. X    *s2 = 0;
  1495. X    return str;
  1496. X}
  1497. X
  1498. X/* the body of the new processes, must be re-entrant */
  1499. Xstruct PEnv *philosopher(env)
  1500. Xstruct PEnv *env;
  1501. X{
  1502. X    int i,me;
  1503. X    struct Forks *f;
  1504. X    FILE *win;
  1505. X
  1506. X    me = env->num;
  1507. X
  1508. X    /* open monitorwindow */
  1509. X    switch(me) {
  1510. X        case 0:    CR(win = fopen("CON:10/10/200/80/Philo0","w");)
  1511. X            break;
  1512. X        case 1: CR(win = fopen("CON:220/10/200/80/Philo1","w");)
  1513. X            break;
  1514. X        case 2: CR(win = fopen("CON:10/115/200/80/Philo2","w");)
  1515. X            break;
  1516. X        case 3: CR(win = fopen("CON:220/115/200/80/Philo3","w");)
  1517. X            break;
  1518. X        default:
  1519. X            break;
  1520. X    }
  1521. X
  1522. X    /* let each philosopher eat 20 times */
  1523. X    for(i = 0; i < 20; i++) {
  1524. X        f = (struct Forks *)AwaitNamedEnvelope("Forkalloc");
  1525. X        while (f->inuse[me] || f->inuse[(me+1) % PHILONUM]) {
  1526. X            Out(f);
  1527. X            f = (struct Forks *)AwaitNamedEnvelope("Forkalloc");
  1528. X        }
  1529. X
  1530. X        /* no one used the forks, now sit on them */
  1531. X        f->inuse[me] = TRUE;
  1532. X        f->inuse[(me+1) % PHILONUM] = TRUE;
  1533. X
  1534. X        /* allow others to look at me eating */
  1535. X        Out(f);
  1536. X
  1537. X        /* eat */
  1538. X        CR(fprintf(win,"philosopher #%d eating\n",me);)
  1539. X
  1540. X        /* release the forks */
  1541. X        f = (struct Forks *)AwaitNamedEnvelope("Forkalloc");
  1542. X        f->inuse[me] = FALSE;
  1543. X        f->inuse[(me+1) % PHILONUM] = FALSE;
  1544. X        Out(f);
  1545. X    }
  1546. X    CR(fclose(win);)
  1547. X    return(env);
  1548. X}
  1549. X
  1550. Xmain()
  1551. X{
  1552. X    int i;
  1553. X    struct PEnv *env;
  1554. X    struct Forks *copy_forks;
  1555. X
  1556. X    /* set up semaphore to protect C library routines that are */
  1557. X    /* not re-entrant */
  1558. X
  1559. X    InitSemaphore(&xx);
  1560. X
  1561. X    /* open odin.library */
  1562. X    OdinBase = (struct OdinBase *)OpenLibrary("RAM:odin.library",0L);
  1563. X    if(OdinBase == NULL) {
  1564. X        printf("Error: Couldn't open odin.library\n");
  1565. X        exit(10);
  1566. X    }
  1567. X
  1568. X    /* now create a few philosopher-processes */
  1569. X    for(i = 0; i < PHILONUM; i++) {
  1570. X        env = (struct PEnv *)CreateEnvelope(
  1571. X            philoname(&s[i][0],"phil#",i),
  1572. X            (ULONG)sizeof(struct PEnv));
  1573. X        env->e.e_proc = philosopher;
  1574. X        env->num = i;
  1575. X        (void)Eval(env,0L,8000L,EVAL_PROCESS);
  1576. X    }
  1577. X
  1578. X    /* init the allocation envelope */
  1579. X    the_forks = (struct Forks *)CreateEnvelope("Forkalloc",
  1580. X                        (ULONG)sizeof(struct Forks));
  1581. X
  1582. X    for(i = 0; i < PHILONUM; i++) the_forks->inuse[i] = FALSE;
  1583. X
  1584. X    Out(the_forks);
  1585. X
  1586. X    copy_forks = (struct Forks *)CreateEnvelope("Forkalloc",
  1587. X                        (ULONG)sizeof(struct Forks));
  1588. X    while((env = (struct PEnv *)PollNamedEnvelope(&s[0][0])) == NULL) {
  1589. X        Rd(copy_forks);
  1590. X        CR(    printf("Forks in use: ");
  1591. X            USE(0);
  1592. X            USE(1);
  1593. X            USE(2);
  1594. X            USE(3);
  1595. X            printf("\n");
  1596. X        )
  1597. X    }
  1598. X
  1599. X    DisposeEnvelope(copy_forks);
  1600. X    DisposeEnvelope(env);
  1601. X
  1602. X    /* now wait for other philosophers to die */
  1603. X    for(i = 1; i < PHILONUM; i++) {
  1604. X        DisposeEnvelope(AwaitNamedEnvelope(&s[i][0]));
  1605. X    }
  1606. X
  1607. X    /* get rid of allocation-envelope, wait at most 10 secs */
  1608. X    DisposeEnvelope(AwaitTimed("Forkalloc",10L,0L));
  1609. X    CloseLibrary(OdinBase);
  1610. X}
  1611. END_OF_FILE
  1612. if test 3995 -ne `wc -c <'philosophers.c'`; then
  1613.     echo shar: \"'philosophers.c'\" unpacked with wrong size!
  1614. fi
  1615. # end of 'philosophers.c'
  1616. fi
  1617. if test -f 'readme.uu' -a "${1}" != "-c" ; then 
  1618.   echo shar: Will not clobber existing file \"'readme.uu'\"
  1619. else
  1620. echo shar: Extracting \"'readme.uu'\" \(4849 characters\)
  1621. sed "s/^X//" >'readme.uu' <<'END_OF_FILE'
  1622. Xbegin 666 readme
  1623. XM4D5!1$U%(&9O<B!O9&EN+FQI8G)A<GD@5C(N-RP@.2U397`M.3`L(%)E;&5AT
  1624. XM<V4@,@H*05542$]2.B!0971E<B#8<F+F:RX*0T]065))1TA4.B!0971E<B#8+
  1625. XM<F+F:R`Q.3DP+"!!;&P@<FEG:'1S(')E<V5R=F5D+@H*55!$051%(&9O<B!2,
  1626. XM96QE87-E(#(N"@H@("!!(&9E=R!B=6=S(&EN(%)E;&5A<V4@,2!H87,@8F5EH
  1627. XM;B!F:7AE9"P@86YD('-E=F5N(&YE=R!F=6YC=&EO;G,@87)E(&%D9&5D"G1O8
  1628. XM('-U<'!O<G0@=V%I=&EN9R!F;W(@96YV96QO<&5S('=I=&@@82!T:6UE;W5TL
  1629. XM+"!A;F0@9F]R('!U='1I;F<@96YV96QO<&5S"G1O(&UE<W-A9V4M<&]R=',N'
  1630. XM"B`@(%1W;R!F=6YC=&EO;G,@*&YA;65L>2!#;W!Y3W5T*"D@86YD($]U=$5M,
  1631. XM<'1Y16YV96QO<&4H*2D@:&%V92!C:&%N9V5D"G)E='5R;G1Y<&4L('-O(&ET:
  1632. XM)W,@;F]W('!O<W-I8FQE('1O(&-H96-K(&9O<B!M96UO<GD@86QL;V-A=&EOH
  1633. XM;B!F86EL=7)E+@H*("`@5&AE(&5X86UP;&5S(&AA=F4@8F5E;B!E>'1E;F1E#
  1634. XM9"!W:71H('!H:6QO<V]P:&5R<RYC+"!T:&4@9F%M;W5S(&1I;FEN9PIP:&EL9
  1635. XM;W-O<&AE<G,@<')O9W)A;2!S=6=G97-T960@8GD@1&EJ:W-T<F$L(&%N9"!WC
  1636. XM:71H(&1R87<N8R!A('!R;V=R86T*=&AA="!D>6YA;6EC86QL>2!C86X@8W)E;
  1637. XM871E(&]R(&1E<W1R;WD@=&%S:W,@9F]R(&AA;F1L:6YG($E$0TU0(&UE<W-A]
  1638. XM9V5S"F%N9"!D<F%W:6YG(&=R87!H:6-S(&EN(&UU;'1I<&QE('=I;F1O=W,N5
  1639. XM"@H@("!5;F9O<G1U;F%T96QY(&UY(&5X86UP;&5S('=O;B=T(&-O;7!I;&4@Q
  1640. XM(F%S(&ES(B!W:71H(%!$0S,N,S,@86YY;6]R92P*9'5E('1O('1H92!D:69F:
  1641. XM:6-U;'1Y(&]F(')U;FYI;F<@4$1#(&EN(&]N;'D@,2!-0BP@87,@=V5L;"!AU
  1642. XM<R!O=&AE<B!P<F]B;&5M<PIW:71H('1H:7,@8V]M<&EL97(N(%1H92!G;'5E.
  1643. XM8V]D92!S:&]U;&0@<W1I;&P@=V]R:R!W:71H(%!$0R!A;F0@3&%T=&EC92P*W
  1644. XM=&AO=6=H+@H*("`@1FEN86QL>2P@22!W;W5L9"!L:6ME('1O('1H86YK('1H:
  1645. XM92!C<F5A=&]R<R!O9B!T:&4@9F]L;&]W:6YG('!R;V=R86US"G=I=&AO=70@X
  1646. XM=VAI8V@@=&AI<R!L:6)R87)Y('=O=6QD(&YO="!E>&ES=#H*"B`@($=/348L,
  1647. XM($UE=&%38V]P92`H5&AE($1E8G5G9V5R*2!A;F0@038X2PH*+2TM+2TM+2TM.
  1648. XM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TMI
  1649. XM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+0I214%$344@9F]R(&]D:6XN;&EB<F%RQ
  1650. XM>2!6,2XQ,2P@,3,M2G5L+3DP+"!296QE87-E(#$*"B`@($]D:6XN;&EB<F%R4
  1651. XM>2!P<F]V:61E<R!Y970@86YO=&AE<B!W87D@;V8@:6YT97)P<F]C97-S+6-ON
  1652. XM;6UU;FEC871I;VX@86YD"FUU;'1I=&%S:VEN9R!S=7!P;W)T(&9O<B!T:&4@"
  1653. XM06UI9V$N(%1H92!F=6YC=&EO;G,@87)E(&EN<W!I<F5D(&)Y($QI;F1A+`IAW
  1654. XM;B!A9&0M;VX@;&%N9W5A9V4@9F]R($,@86YD(&]T:&5R(&QA;F=U86=E<RP@G
  1655. XM=VAI8V@@<')O=FED97,@82!S:6UP;&4*86YD('!O=V5R9G5L('-U<'!O<G0@X
  1656. XM9F]R($E00RX*"B`@($]D:6XN;&EB<F%R>2!I<R!&<F5E5V%R92X@5&AA="!IG
  1657. XM<RP@<&5R;6ES<VEO;B!I<R!G<F%N=&5D('1O(&9R965L>0ID:7-T<FEB=71E\
  1658. XM(&%N9"!C;W!Y(&ET+"!P=70@:70@;VX@1FES:$1I<VMS(&%N9"!O=&AE<B!0W
  1659. XM1"!D:7-K<RX*3F\@8VAA<F=E(&QA<F=E<B!T:&%N(%53("0V+C`P(&UU<W0@"
  1660. XM8F4@=&%K96X@9F]R('1H:7,@<&EE8V4@;V8@<V]T=V%R92X*66]U(&-A;B!A!
  1661. XM;'-O(&QE9V%L;'D@:6YC;'5D92!I="!W:71H(&-O;6UE<F-I86P@<V]F='=AE
  1662. XM<F4L(&%S(&QO;F<@87,@=&AI<R`*;F]T:6-E(&ES(&EN8VQU9&5D(&%L;VYG4
  1663. XM('=I=&@@:70N"@HM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM5
  1664. XM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM"@I#Y
  1665. XM3TY414Y44R!O9B!296QE87-E(#(Z"@IO9&EN+FQI8G)A<GD@("!4:&4@06UIF
  1666. XM9V%$;W,@;&EB<F%R>2!B:6YA<GDN(%!U="!T:&ES(&EN('EO=7(@3$E"4SH*[
  1667. XM("`@("`@("`@("`@("`@9&ER96-T;W)Y+@H*;V1I;BYD;V,@("`@("`@1&]C[
  1668. XM=6UE;G1A=&EO;B!A;F0@9G5N8W1I;VX@9&5S8W)I<'1I;VXN"@IO9&EN7VQI!
  1669. XM8BYF9"`@("!3=&%N9&%R9"`N9F0@9FEL92P@=&\@9V5N97)A=&4@96<N($%ME
  1670. XM:6=A0D%324,@:6YT97)F86-E"B`@("`@("`@("`@("`@($-O=6QD(&)E('5ST
  1671. XM960@=&\@9V5N97)A=&4@3&%T=&EC92`C<')A9VUA)W,@=&]O+"!)('1H:6YKW
  1672. XM+@H*;V1I;F=L=64N87-M("`@1VQU96-O9&4@=&\@:6YT97)F86-E('=I=&@@@
  1673. XM0R!C;VUP:6QE<G,N"B`@("`@("`@("`@("`@($%S<V5M8FQE<R!/2R!U;F1EN
  1674. XM<B!!>G1E8R`G87,G(&%N9"!!-CA+(#(N-@H@("`@("`@("`@("`@("!!<W-ED
  1675. XM;6)L92!W:71H($$V.$L@9F]R('5S92!W:71H($QA='1I8V4@86YD($)L:6YK/
  1676. XM"@IO9&EN+F@@("`@("`@("!#(&AE861E<B!W:71H(&9U;F-T:6]N('!R;W1OV
  1677. XM='EP97,@9F]R($%Z=&5C(&%N9"!!3E-)('-T=69F"@IO9&EN+FD@("`@("`@.
  1678. XM("!);F-L=61E9FEL92!F;W(@07-S96TO038X2PH*36%K969I;&4@("`@("`@?
  1679. XM1F]R(&=E;F5R871I;F<@=&AE(&5X86UP;&5S('=I=&@@07IT96,@0R`S+C0P&
  1680. XM02!O<B!L871E<@H@("`@("`@("`@("`@("!&;W(@9V5N97)A=&EN9R!A;&P@(
  1681. XM97AA;7!L97,@<V%Y.B!M86ME(&%L;`H**BHJ($Y"+B!T:&4@97AA;7!L97,@-
  1682. XM8F5L;W<@97AP96-T(&]D:6XN;&EB<F%R>2!T;R!B92!I;B!204TZ("HJ*@H*\
  1683. XM;V1I;G1E<W0N8R`@("`@5&5S="!O9B!A;&P@9G5N8W1I;VYS(&EN(&]D:6XNQ
  1684. XM;&EB<F%R>0H*;V1I;F1E;6\Q+F,@("`@4VEM<&QE(&1E;6\*"F1R87<N8R`@<
  1685. XM("`@("`@($AA;F1L97,@;75L=&EP;&4@=VEN9&]W<R!A;F0@=&%S:W,@=7-I@
  1686. XM;F<@;V1I;BYL:6)R87)Y"@IP:&EL;W-O<&AE<G,N8R!4:&4@9&EN:6YG('!H9
  1687. XM:6QO<V]P:&5R<RX*"G1A<VMS+F,@("`@("`@(%5T:6QI='DL(&EN9&5P96YD(
  1688. XM96YT(&]F(&]D:6XN;&EB<F%R>2!T:&%T(&QI<W1S('1A<VMS"@H@("!1=65SA
  1689. XM=&EO;G,L(&)U9R!R97!O<G1S+"!C;VUM96YT<R!E=&,N('-H;W5L9"!B92!E]
  1690. XM+6UA:6QE9"!T;R!M92!A="!T:&4@"F%D9')E<W,@8F5L;W<N($5N:F]Y+@H*"
  1691. XM4%,N($D@=V]U;&0@;&EK92!T;R!K;F]W(&EF('1H:7,@=V]R:W,@8V]R<F5CG
  1692. XM=&QY(&]N('1H92!!,S`P,"P@<V\@<&QE87-E"B`@("!R97!O<G0@:68@>6]UU
  1693. XM(&%R92!S;R!L=6-K>2!T;R!H879E(&]N92X*"@I);G1E<FYE=#H@<&]E0&1A#
  1694. XM:6UI+F%A=2YD:R`@("`@("`\/#PM+2TM+2!.;W1E('1H92!C:&%N9V4A"B`@>
  1695. XM("`@("`@("!P;V5`9&%I;6DN9&L@("`@("`@("`@("AO;&0@861D<F5S<RD*%
  1696. XM555#4#H@("`@("XN+B%U=6YE="%M8W-U;B%S=6YI8R%D:W5U9R%D86EM:2%PT
  1697. XM;V4*"E--86EL.B`@(%!E=&5R(-AR8N9K"B`@("`@("`@($AA<VQE(%)I;F=VR
  1698. XM96H@,3(R"B`@("`@("`@($1++3@R,#`@06%R:'5S($XN"B`@("`@("`@($1EG
  1699. X2;FUA<FL*"B`@+2!0971E<BX*R
  1700. X``
  1701. Xend
  1702. Xsize 3438
  1703. END_OF_FILE
  1704. if test 4849 -ne `wc -c <'readme.uu'`; then
  1705.     echo shar: \"'readme.uu'\" unpacked with wrong size!
  1706. fi
  1707. # end of 'readme.uu'
  1708. fi
  1709. if test -f 'tasks.c' -a "${1}" != "-c" ; then 
  1710.   echo shar: Will not clobber existing file \"'tasks.c'\"
  1711. else
  1712. echo shar: Extracting \"'tasks.c'\" \(1477 characters\)
  1713. sed "s/^X//" >'tasks.c' <<'END_OF_FILE'
  1714. X/****************************************************************
  1715. X* tasks.c Version 1.0
  1716. X* Created 25-aug-90
  1717. X* Lists tasks/processes currently running
  1718. X****************************************************************/
  1719. X
  1720. X#include    "exec/types.h"
  1721. X#include    "exec/execbase.h"
  1722. X#include    "stdio.h"
  1723. X
  1724. Xstruct MyMem {
  1725. X    char    name[80];
  1726. X    int    pri;
  1727. X    ULONG    addr;
  1728. X};
  1729. X
  1730. Xstruct MyMem mem[80];        /* holds max 80 tasks */
  1731. X
  1732. Xextern struct ExecBase *SysBase;
  1733. X
  1734. Xvoid main()
  1735. X{
  1736. X    struct Task *ptr;
  1737. X    int numtasks;
  1738. X    UWORD *tmp;
  1739. X    ULONG *tmp2;
  1740. X
  1741. X    numtasks = 0;
  1742. X
  1743. X    printf("Pri\tTask\tName\n");
  1744. X
  1745. X    Forbid();
  1746. X    ptr = (struct Task *)(SysBase->TaskReady.lh_Head);
  1747. X    while(ptr->tc_Node.ln_Succ != NULL) {
  1748. X        mem[numtasks].pri = (int)ptr->tc_Node.ln_Pri;
  1749. X        mem[numtasks].addr = (ULONG)ptr;
  1750. X
  1751. X        if(ptr->tc_Node.ln_Name != NULL) {
  1752. X            strcpy(mem[numtasks].name,ptr->tc_Node.ln_Name);
  1753. X        } else {
  1754. X            strcpy(mem[numtasks].name,"<anonymous>");
  1755. X        }
  1756. X        numtasks++;
  1757. X        ptr = (struct Task *)ptr->tc_Node.ln_Succ;
  1758. X    }
  1759. X    ptr = (struct Task *)(SysBase->TaskWait.lh_Head);
  1760. X    while(ptr->tc_Node.ln_Succ != NULL) {
  1761. X        mem[numtasks].pri = (int)ptr->tc_Node.ln_Pri;
  1762. X        mem[numtasks].addr = (ULONG)ptr;
  1763. X
  1764. X        if(ptr->tc_Node.ln_Name != NULL) {
  1765. X            strcpy(mem[numtasks].name,ptr->tc_Node.ln_Name);
  1766. X        } else {
  1767. X            strcpy(mem[numtasks].name,"<anonymous>");
  1768. X        }
  1769. X        numtasks++;
  1770. X        ptr = (struct Task *)ptr->tc_Node.ln_Succ;
  1771. X    }
  1772. X    Permit();
  1773. X
  1774. X    while(--numtasks >= 0) {
  1775. X        printf("%3d",mem[numtasks].pri);
  1776. X        printf("\t%6lx\t%s\n",mem[numtasks].addr,mem[numtasks].name);
  1777. X    }
  1778. X}
  1779. X
  1780. END_OF_FILE
  1781. if test 1477 -ne `wc -c <'tasks.c'`; then
  1782.     echo shar: \"'tasks.c'\" unpacked with wrong size!
  1783. fi
  1784. # end of 'tasks.c'
  1785. fi
  1786. echo shar: End of archive 1 \(of 2\).
  1787. cp /dev/null ark1isdone
  1788. MISSING=""
  1789. for I in 1 2 ; do
  1790.     if test ! -f ark${I}isdone ; then
  1791.     MISSING="${MISSING} ${I}"
  1792.     fi
  1793. done
  1794. if test "${MISSING}" = "" ; then
  1795.     echo You have unpacked both archives.
  1796.     rm -f ark[1-9]isdone
  1797. else
  1798.     echo You still need to unpack the following archives:
  1799.     echo "        " ${MISSING}
  1800. fi
  1801. ##  End of shell archive.
  1802. exit 0
  1803. -- 
  1804. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  1805. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  1806. Post requests for sources, and general discussion to comp.sys.amiga.
  1807.